标签: renderscript

如何在Android中与OpenGL共享Renderscript分配

我有一个Renderscript,它处理输出中给出的分配图像.我想在我的OpenGL程序中将此Allocation用作纹理,但我不知道如何从分配中获取纹理ID.

另一方面,我知道我可以使用图形Renderscript,但由于它已被弃用,我想必须有其他方法来实现相同的结果.

android renderscript opengl-es-2.0

6
推荐指数
1
解决办法
2851
查看次数

如何让Android Render Script Group工作?

我可以让两个独立的内在函数工作,但不能在ScriptGroup中一起工作.我发现有关如何使用Script Group的文档非常稀疏.

这是我的代码:

mRS = RenderScript.create(getActivity());

mInAllocation = Allocation.createFromBitmap(mRS, mBitmapIn,
        Allocation.MipmapControl.MIPMAP_NONE,
        Allocation.USAGE_SCRIPT |
                Allocation.USAGE_GRAPHICS_TEXTURE |
                Allocation.USAGE_SHARED);

mOutAllocation = Allocation.createFromBitmap(mRS, mBitmapOut,
        Allocation.MipmapControl.MIPMAP_NONE,
        Allocation.USAGE_SCRIPT |
                Allocation.USAGE_SHARED);

ScriptIntrinsicColorMatrix gray = ScriptIntrinsicColorMatrix.create(mRS, Element.U8_4(mRS));
gray.setGreyscale();

ScriptIntrinsicBlur blur = ScriptIntrinsicBlur.create(mRS, Element.U8_4(mRS));
blur.setRadius(20.f);
blur.setInput(mInAllocation);

//gray.forEach(mInAllocation, mOutAllocation);
blur.forEach(mOutAllocation);

mOutAllocation.copyTo(mBitmapOut);
Run Code Online (Sandbox Code Playgroud)

灰色和模糊都有效.然后我尝试将它们放在一起,结果是空白的.码:

// gray.forEach(mInAllocation, mOutAllocation);
// blur.forEach(mOutAllocation);
// mOutAllocation.copyTo(mBitmapOut);

ScriptGroup.Builder builder = new ScriptGroup.Builder(mRS);
builder.addKernel(gray.getKernelID());
builder.addKernel(blur.getKernelID());
builder.addConnection(mInAllocation.getType(), gray.getKernelID(), blur.getKernelID());

ScriptGroup group = builder.create();
group.setInput(gray.getKernelID(), mInAllocation);
group.setOutput(blur.getKernelID(), mOutAllocation);
group.execute();

mOutAllocation.copyTo(mBitmapOut);
Run Code Online (Sandbox Code Playgroud)

android renderscript

6
推荐指数
1
解决办法
1510
查看次数

在运行时编译渲染脚本代码

我想知道是否可以在 android 应用程序运行时编写/修改渲染脚本代码。我的主要目标是制作一个应用程序,用户可以在没有任何 Java 知识的情况下学习使用 renderscript。应用程序的基本布局将由输入和输出图像组成,并可以输入代码。此应用程序的基本功能已经在运行,这是界面图像。 应用布局

使用来自应用程序的直接反馈来测试渲染脚本代码会很有用。

我已经对构建过程进行了研究,并提出了以下想法:

一个基本的“模板”渲染脚本文件,具有必要的全局变量,如输入和输出分配。

我的 java 代码将创建一个生成的 java 类的脚本对象,并对这些全局脚本变量进行基本的初始化。这个模板 .rs 文件的根函数应该是空的,应该可以由用户在运行时实现。

当用户在应用程序的主视图中输入他的代码时,代码被写入我自己的 .rs 文件,然后由应用程序调用的 llvm-rs-cc 编译器编译。然后将生成的 .bc 复制到模板的原始 .bc 文件所在的位置。因为代码的唯一更改发生在 root 函数内部,所以没有必要对周围的 java 代码进行更改。

我目前遇到的问题是 .bc 文件捆绑在 res/raw 文件夹内的最终 apk 中,该应用程序无法访问。因此,不可能用新生成的文件覆盖旧的 .bc 文件。

有没有(另一种)方法可以在运行时编译渲染脚本代码?

编辑:可以在此github链接中找到解决方案。有关更多详细信息,请查看答案,阅读最后一条评论

java android renderscript

6
推荐指数
1
解决办法
1128
查看次数

使用renderscript进行处理,使用mediacodec进行编码

我正在尝试开发一个在录制视频之前进行一些视频处理的相机应用程序.我决定使用Rendrscript进行处理,因为它提供了我想要使用的许多操作.我想使用MediaCodec进行编码.我找到了一些样本(包括Grafika),展示了如何使用GLES进行处理,但我还没有找到一个示例,说明如何使用RenderScript.尝试用Renderscript替换GLES我有以下问题:

  1. 我从编码器输入表面创建RenderScript输出分配.在Grafika示例中,EGL swapbuffer()用于向编码器发送缓冲区.Allocation.ioSend()是否做同样的事情?
  2. 在EGL中,setPresentationTime()用于设置时间戳.如何在Renderscript的分配中设置时间戳?
  3. 我应该使用MediaCodec.queueInputBuffer()代替提交输入缓冲区和时间戳吗?在那种情况下,我应该在调用queueInputBuffer之前调用Allocation.ioSend()吗?

android renderscript mediacodec

6
推荐指数
1
解决办法
626
查看次数

如何使用无伪影的Renderscript模糊效果?

背景

有很多地方(包括here)来展示如何使用Renderscript来模糊图像,例如:

@TargetApi(VERSION_CODES.JELLY_BEAN_MR1)
public static Bitmap renderScriptBlur(Context context, Bitmap srcBitmap, @FloatRange(from = 0.0f, to = 25.0f) float radius) {
    if (srcBitmap == null)
        return null;
    Bitmap outputBitmap = null;
    RenderScript rs = null;
    try {
        rs = RenderScript.create(context);
        outputBitmap = Bitmap.createBitmap(srcBitmap.getWidth(), srcBitmap.getHeight(), Bitmap.Config.ARGB_8888);
        final Canvas canvas = new Canvas(outputBitmap);
        canvas.drawBitmap(srcBitmap, 0, 0, null);
        Allocation overlayAlloc = Allocation.createFromBitmap(rs, outputBitmap);
        ScriptIntrinsicBlur blur = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));
        blur.setInput(overlayAlloc);
        blur.setRadius(radius);
        blur.forEach(overlayAlloc);
        overlayAlloc.copyTo(outputBitmap);
        return outputBitmap;
    } catch (Exception ex) {
        if (outputBitmap != null) …
Run Code Online (Sandbox Code Playgroud)

android bitmap blur renderscript

6
推荐指数
1
解决办法
2445
查看次数

如何在Nvidia Shield上正确计算Android RenderScript代码的时间

我在RenderScript中实现了一个小型CNN,并希望在不同硬件上分析性能.在我的Nexus 7上,时间是有意义的,但在NVIDIA Shield上他们没有.

CNN(LeNet)以驻留在队列中的9层实现,计算按顺序执行.每个层都是单独计时的.

这是一个例子:

       conv1  pool1 conv2  pool2 resh1 ip1    relu1  ip2    softmax
nexus7 11.177 7.813 13.357 8.367 8.097 2.1    0.326  1.557  2.667
shield 13.219 1.024 1.567  1.081 0.988 14.588 13.323 14.318 40.347
Run Code Online (Sandbox Code Playgroud)

时间的分布对于nexus来说是正确的,其中conv1和conv2(卷积层)占用大部分时间.但是在盾牌上,时间下降的方式超出了2-4层的合理范围,并且似乎朝着最后的方向聚集起来.softmax层是一个相对较小的工作,因此40ms太大了.我的计时方法必须是错误的,或者正在发生其他事情.

运行图层的代码如下所示:

double[] times = new double[layers.size()];
int layerindex = 0;
for (Layer a : layers) {

    double t = SystemClock.elapsedRealtime(); 
    //long t = System.currentTimeMillis(); // makes no difference

    blob = a.forward(blob); // here we call renderscript forEach_(), invoke_() etc

    //mRS.finish(); // makes no difference

    t …
Run Code Online (Sandbox Code Playgroud)

performance multithreading android timing renderscript

6
推荐指数
1
解决办法
543
查看次数

Camera2 api Imageformat.yuv_420_888 旋转图像的结果

关于camera2 api和RAW图像格式有很多问题,但在网上搜索我仍然没有找到答案(这就是我在这里的原因顺便说一句)。

我正在尝试使用ImageReader和 setRepeatingRequest 与前置摄像头对摄像头捕获的帧进行一些实时图像处理。正如之前的一些帖子所建议的,我正在以 RAW 格式(特别是 Imageformat.yuv_420_888)获取图像,以便获得大约 30fps 的帧速率:

  imageReader = ImageReader.newInstance(width, height, ImageFormat.YUV_420_888, 2); 
Run Code Online (Sandbox Code Playgroud)

我的图像处理算法需要 RGB 图像作为输入,所以我需要从 YUV 转换为 RGB。为此,我使用ScriptIntrinsicYuvToRGB

  private static Bitmap YUV_420_888_toRGBIntrinsics(Image image) {

    if (image == null) return null;

    int W = image.getWidth();
    int H = image.getHeight();

    Image.Plane Y = image.getPlanes()[0];
    Image.Plane U = image.getPlanes()[1];
    Image.Plane V = image.getPlanes()[2];

    int Yb = Y.getBuffer().remaining();
    int Ub = U.getBuffer().remaining();
    int Vb = V.getBuffer().remaining();

    byte[] data = new byte[Yb + Ub + Vb];


    Y.getBuffer().get(data, 0, …
Run Code Online (Sandbox Code Playgroud)

android image-processing yuv renderscript android-camera2

6
推荐指数
1
解决办法
2567
查看次数

RenderScript错误地操作内核的输出

我正在尝试使用Android的RenderScript在图像后面渲染一个半透明的圆圈,但是从RenderScript内核返回一个值时出了问题.

这是我的内核:

#pragma version(1)
#pragma rs java_package_name(be.abyx.aurora)
// We don't need very high precision floating points
#pragma rs_fp_relaxed

// Center position of the circle
int centerX = 0;
int centerY = 0;

// Radius of the circle
int radius = 0;

// Destination colour of the background can be set here.
float destinationR;
float destinationG;
float destinationB;
float destinationA;

static int square(int input) {
    return input * input;
}

uchar4 RS_KERNEL circleRender(uchar4 in, uint32_t x, uint32_t y) {
    //Convert input …
Run Code Online (Sandbox Code Playgroud)

android renderscript android-renderscript

6
推荐指数
1
解决办法
184
查看次数

三星Galaxy S9 + renderscript错误

我正在使用Camera2 API,我正在使用Renderscript执行一些图像处理.除了S9 +之外,所有设备(Nexus 5/5x,Pixel,Pixel 2,S8 +,Note 8)都能正常运行.

基本上我正在做的是创建一个Allocation接收相机数据和另一个Allocation将使用相机数据,应用转换和显示结果Surface将作为相机预览.在S9 +上我得到一个黑屏(没有预览),LogCat显示以下错误:

renderscript错误

我阅读了有关此类错误的其他帖子,但它们不适用于我的案例,因为代码在其他设备上按预期工作!

我设法将错误跟踪到本机库加载问题: 堆栈跟踪

这只发生在S9上,其他三星设备没有任何问题.

S8 +在Android Nougat(24)上,而S9 +在Oreo(26)上,都有OpenGL ES 3.2.

有没有人知道如何解决这个问题?

PS:在运行Oreo的其他设备上测试没有任何问题

编辑

我将S9 +更新到最新版本(R16NW.G965FXXU1ARCC),但问题仍然存在.此外,根据意见建议,我检查了/供应商/ lib64的文件夹,检查libbccArmlibccc存在,但其中只有一个是存在:

在此输入图像描述

稍后编辑

libbcc.so 在系统上找到但是S9 +似乎缺少32位版本(左边是S8 +,右边是S9 +)

在此输入图像描述

android renderscript android-8.0-oreo

6
推荐指数
1
解决办法
441
查看次数

RenderScript在macOS Catalina(10.15)上损坏

我已经更新到MacOS Catalina。今天早上,当我在做Android项目时,它突然开始出现以下异常:“错误:原因:错误= 86,可执行文件中的CPU类型错误”。

我怀疑它是因为我更新到了macOS 10.15,并且因为我试图为我的项目构建APK(因此它重建了renderscript的东西)。这是给定的完整堆栈跟踪:

org.gradle.process.internal.ExecException: A problem occurred starting process 'command '/Users/name/Library/Android/sdk/build-tools/28.0.3/arm-linux-androideabi-ld''
    at org.gradle.process.internal.DefaultExecHandle.execExceptionFor(DefaultExecHandle.java:232)
    at org.gradle.process.internal.DefaultExecHandle.setEndStateInfo(DefaultExecHandle.java:209)
    at org.gradle.process.internal.DefaultExecHandle.failed(DefaultExecHandle.java:356)
    at org.gradle.process.internal.ExecHandleRunner.run(ExecHandleRunner.java:86)
    at org.gradle.internal.operations.CurrentBuildOperationPreservingRunnable.run(CurrentBuildOperationPreservingRunnable.java:38)
    at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
    at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
    at java.lang.Thread.run(Thread.java:748)
Caused by: net.rubygrapefruit.platform.NativeException: Could not start '/Users/name/Library/Android/sdk/build-tools/28.0.3/arm-linux-androideabi-ld'
    at net.rubygrapefruit.platform.internal.DefaultProcessLauncher.start(DefaultProcessLauncher.java:27)
    at net.rubygrapefruit.platform.internal.WrapperProcessLauncher.start(WrapperProcessLauncher.java:36)
    at org.gradle.process.internal.ExecHandleRunner.startProcess(ExecHandleRunner.java:97)
    at org.gradle.process.internal.ExecHandleRunner.run(ExecHandleRunner.java:70)
    ... 7 more
Caused by: java.io.IOException: Cannot run program "/Users/name/Library/Android/sdk/build-tools/28.0.3/arm-linux-androideabi-ld" (in directory "/Users/name/Documents/Projects/onlinetrucks_android/MyApplication/app"): error=86, Bad CPU type in executable
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
    at net.rubygrapefruit.platform.internal.DefaultProcessLauncher.start(DefaultProcessLauncher.java:25)
    ... 10 more
Caused by: java.io.IOException: error=86, …
Run Code Online (Sandbox Code Playgroud)

macos android renderscript macos-catalina

6
推荐指数
1
解决办法
406
查看次数