RenderScript 变量类型和元素类型,简单示例

RenderScript Variable types and Element types, simple example

我清楚地看到需要加深我在 RenderScript 内存分配和数据类型方面的知识(我仍然对数据类型的绝对数量感到困惑,并且在任何一方找到正确的对应类型 - 分配和元素。(或何时将 forEach 引用到输入、输出或两者等)因此我将阅读并重新阅读文档,这确实不错 - 但需要一些时间才能获得必要的 "intuition" 如何正确使用它。但是现在,请帮助我解决这个基本问题(我会 return 稍后提出希望不那么愚蠢的问题......)。我需要一个非常简单的内核,它采用 ARGB 颜色位图和 returns 灰度值的整数数组。我的尝试如下:

#pragma version(1)
#pragma rs java_package_name(com.example.xxxx)
#pragma rs_fp_relaxed

uint __attribute__((kernel)) grauInt(uchar4 in) {
uint gr= (uint) (0.2125*in.r + 0.7154*in.g + 0.0721*in.b);
return gr;  
} 

和Java方:

  int[] data1 = new int[width*height];

  ScriptC_gray graysc;
  graysc=new ScriptC_gray(rs);

  Type.Builder TypeOut = new Type.Builder(rs, Element.U8(rs));
  TypeOut.setX(width).setY(height);
  Allocation outAlloc = Allocation.createTyped(rs, TypeOut.create());

  Allocation inAlloc = Allocation.createFromBitmap(rs, bmpfoto1,       
  Allocation.MipmapControl.MIPMAP_NONE, Allocation.USAGE_SCRIPT);
    graysc.forEach_grauInt(inAlloc, outAlloc);
    outAlloc.copyTo(data1);

此崩溃并显示消息找不到符号 "convert_uint"。这种转换有什么问题?代码是否正确?

更新:这不是很荒谬吗?即使经过 2 小时的尝试,我也没有得到 "easy one" 运行。我仍然在与不同的元素类型和变量类型作斗争。让我们回顾一下:输入是位图。输出是一个 int[] 数组。那么,当我在 Java 侧输出分配中使用 U8、在 Java 侧输入分配中使用 createFromBitmap、uchar4 作为内核输入和 uint 作为内核输出时,为什么它不起作用(RSRuntimeException:类型与 U32 不匹配) ?

没有convert_uint()函数。简单的铸造怎么样?除此之外,代码看起来没问题(假设 widthheight 具有正确的值)。

更新:我刚刚注意到您从内核分配了 Element.I32(即有符号整数类型),但是 return uint。这些应该匹配。在任何情况下,除非您需要超过 8 位的精度,否则您应该能够将结果放入 U8。

更新:如果您要更改输出类型,请确保在所有地方都进行了更改,例如如果内核 return 是 uint,分配应该使用 U32。如果内核return是char,分配应该使用I8。等等...

您不能直接使用 Uint[],因为输入 Bitmap 实际上是二维的。您可以使用适当的 width/height 创建输出分配并尝试吗?完成后,您应该仍然能够将值提取到 Java 数组中。