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()
函数。简单的铸造怎么样?除此之外,代码看起来没问题(假设 width
和 height
具有正确的值)。
更新:我刚刚注意到您从内核分配了 Element.I32
(即有符号整数类型),但是 return uint
。这些应该匹配。在任何情况下,除非您需要超过 8 位的精度,否则您应该能够将结果放入 U8。
更新:如果您要更改输出类型,请确保在所有地方都进行了更改,例如如果内核 return 是 uint
,分配应该使用 U32
。如果内核return是char
,分配应该使用I8
。等等...
您不能直接使用 Uint[],因为输入 Bitmap 实际上是二维的。您可以使用适当的 width/height 创建输出分配并尝试吗?完成后,您应该仍然能够将值提取到 Java 数组中。
我清楚地看到需要加深我在 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()
函数。简单的铸造怎么样?除此之外,代码看起来没问题(假设 width
和 height
具有正确的值)。
更新:我刚刚注意到您从内核分配了 Element.I32
(即有符号整数类型),但是 return uint
。这些应该匹配。在任何情况下,除非您需要超过 8 位的精度,否则您应该能够将结果放入 U8。
更新:如果您要更改输出类型,请确保在所有地方都进行了更改,例如如果内核 return 是 uint
,分配应该使用 U32
。如果内核return是char
,分配应该使用I8
。等等...
您不能直接使用 Uint[],因为输入 Bitmap 实际上是二维的。您可以使用适当的 width/height 创建输出分配并尝试吗?完成后,您应该仍然能够将值提取到 Java 数组中。