我有一个Renderscript,它处理输出中给出的分配图像.我想在我的OpenGL程序中将此Allocation用作纹理,但我不知道如何从分配中获取纹理ID.
另一方面,我知道我可以使用图形Renderscript,但由于它已被弃用,我想必须有其他方法来实现相同的结果.
我可以让两个独立的内在函数工作,但不能在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 应用程序运行时编写/修改渲染脚本代码。我的主要目标是制作一个应用程序,用户可以在没有任何 Java 知识的情况下学习使用 renderscript。应用程序的基本布局将由输入和输出图像组成,并可以输入代码。此应用程序的基本功能已经在运行,这是界面图像。

使用来自应用程序的直接反馈来测试渲染脚本代码会很有用。
我已经对构建过程进行了研究,并提出了以下想法:
一个基本的“模板”渲染脚本文件,具有必要的全局变量,如输入和输出分配。
我的 java 代码将创建一个生成的 java 类的脚本对象,并对这些全局脚本变量进行基本的初始化。这个模板 .rs 文件的根函数应该是空的,应该可以由用户在运行时实现。
当用户在应用程序的主视图中输入他的代码时,代码被写入我自己的 .rs 文件,然后由应用程序调用的 llvm-rs-cc 编译器编译。然后将生成的 .bc 复制到模板的原始 .bc 文件所在的位置。因为代码的唯一更改发生在 root 函数内部,所以没有必要对周围的 java 代码进行更改。
我目前遇到的问题是 .bc 文件捆绑在 res/raw 文件夹内的最终 apk 中,该应用程序无法访问。因此,不可能用新生成的文件覆盖旧的 .bc 文件。
有没有(另一种)方法可以在运行时编译渲染脚本代码?
我正在尝试开发一个在录制视频之前进行一些视频处理的相机应用程序.我决定使用Rendrscript进行处理,因为它提供了我想要使用的许多操作.我想使用MediaCodec进行编码.我找到了一些样本(包括Grafika),展示了如何使用GLES进行处理,但我还没有找到一个示例,说明如何使用RenderScript.尝试用Renderscript替换GLES我有以下问题:
有很多地方(包括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) 我在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) 关于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的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) 我正在使用Camera2 API,我正在使用Renderscript执行一些图像处理.除了S9 +之外,所有设备(Nexus 5/5x,Pixel,Pixel 2,S8 +,Note 8)都能正常运行.
基本上我正在做的是创建一个Allocation接收相机数据和另一个Allocation将使用相机数据,应用转换和显示结果Surface将作为相机预览.在S9 +上我得到一个黑屏(没有预览),LogCat显示以下错误:
我阅读了有关此类错误的其他帖子,但它们不适用于我的案例,因为代码在其他设备上按预期工作!
这只发生在S9上,其他三星设备没有任何问题.
S8 +在Android Nougat(24)上,而S9 +在Oreo(26)上,都有OpenGL ES 3.2.
有没有人知道如何解决这个问题?
PS:在运行Oreo的其他设备上测试没有任何问题
编辑
我将S9 +更新到最新版本(R16NW.G965FXXU1ARCC),但问题仍然存在.此外,根据意见建议,我检查了/供应商/ lib64的文件夹,检查libbccArm和libccc存在,但其中只有一个是存在:
稍后编辑
libbcc.so 在系统上找到但是S9 +似乎缺少32位版本(左边是S8 +,右边是S9 +)
我已经更新到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) android ×10
renderscript ×10
bitmap ×1
blur ×1
java ×1
macos ×1
mediacodec ×1
performance ×1
timing ×1
yuv ×1