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

时间:2015-08-10 21:48:20

标签: variables types element renderscript

我清楚地看到有必要加深我对RenderScript内存分配和数据类型的了解(我仍然对数据类型的数量庞大并且在任何一方找到正确的相应类型 - 分配和元素感到困惑。(或者何时到请参阅forEach输入,输出或两者等。)因此,我将阅读并重新阅读文档,这真的不错 - 但它需要一些时间来获得必要的“直觉”如何正确使用它。但是现在,请帮我解决这个基本问题(我稍后会回答希望不那么愚蠢的问题......)。我需要一个非常简单的内核,它采用ARGB颜色位图并返回一个灰度值的整数数组。尝试如下:

#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个小时的尝试,我也没有得到这个“简单的”运行。我仍然在使用不同的元素和变量类型。让我们回顾一下:输入是一个位图。输出是一个int []数组。那么,当我在Java端Out-allocation中使用U8,在Java端分配时使用createFromBitmap,uchar4作为内核输入和uint作为内核输出(RSRuntimeException:类型与U32不匹配)时,为什么它不起作用?

2 个答案:

答案 0 :(得分:2)

没有convert_uint()功能。简单铸造怎么样?除此之外,代码看起来还不错(假设widthheight具有正确的值)。

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

更新:如果要更改输出类型,请确保在所有位置更改输出类型,例如如果内核返回uint,则分配应使用U32。如果内核返回char,则分配应使用I8。等等...

答案 1 :(得分:1)

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