Renderscript,什么是`in`参数?

Renderscript, what is the `in` parameter?

我正在尝试了解 Renderscript。有人可以看看这段代码,让我知道 in 参数是什么吗?它不是一个分配对象,所以它是一个元素?那为什么是数组呢?

(我从这里得到代码,并修改了它,http://www.jayway.com/2014/02/11/renderscript-on-android-basics/

#pragma version(1)
#pragma rs java_package_name(foo.bar)

rs_allocation inPixels;
int height;
int width;

void root(const uchar4 *in, uchar4 *out, uint32_t x, uint32_t y) {
    float3 pixel = convert_float4(in[0]).rgb;

    pixel.r = (pixel.r + pixel.g + pixel.b)/3;
    pixel.g = (pixel.r + pixel.g + pixel.b)/3;
    pixel.b = (pixel.r + pixel.g + pixel.b)/3;

    int topRight
    //float4 f4 = rsUnpackColor8888(*(uchar*)rsGetElementAt(inPixels, x+1, y+1));

    out->xyz = convert_uchar3(pixel);
}

这一行 convert_float4(in[0]) 是做什么的? 索引 0 指向什么?第一个像素?因此,如果我想访问下一个像素,我应该将其增加一个吗?

uchar4float3 类型与您在 OpenCL 中找到的基本相同。它们是分别包含 4 个和 3 个分量的矢量值。 convert_float4()convert_uchar3() 函数由 Renderscript 提供,用于在不同类型之间进行正确、快速的转换。

in 参数本质上是一个指针,指向您的内核正在运行的当前元素。 xy 值准确地告诉您 Allocation 中的 Elementin 对应。您不应尝试将其用作数组并直接访问其他元素。如果这样做,您可能会接触到您的进程无法访问的内存。 Renderscript 正在并行处理您的数据集,这可能在不同的线程或不同的处理器 (GPU) 上完成。这取决于硬件实现。

Larry 的回复很好地解释了如何使用这些矢量数据。

您可以使用我们的按值传递样式重写它以使其更清晰:

uchar4 RS_KERNEL root(uchar4 in, uint32_t x, uint32_t y) {
  // x and y aren't used, so you can remove those from the above signature too.
  uchar4 out;
  float3 pixel = convert_float4(in).rgb;

  pixel.r = (pixel.r + pixel.g + pixel.b)/3;
  // This seems buggy to me below, since pixel.r was just modified.
  // I think you need another temporary variable (assuming you are trying to make this work and getting weird behavior).
  pixel.g = (pixel.r + pixel.g + pixel.b)/3;
  pixel.b = (pixel.r + pixel.g + pixel.b)/3;

  //int topRight
  //float4 f4 = rsUnpackColor8888(*(uchar*)rsGetElementAt(inPixels, x+1, y+1));

  out.xyz = convert_uchar3(pixel);
  return out;
}