2

1)我如何在 forEach_root() 中访问除当前元素之外的其他元素?

在 OpenCL 中,我们有指向第一个元素的指针,然后可以使用 get_global_id(0) 来获取当前索引。但是我们仍然可以访问所有其他元素。在 Renderscript 中,我们是否只有指向当前元素的指针?

2) 如何在 forEach_root() 中循环分配分配?

我有一个在 java 中使用嵌套(双)循环的代码。Renderscript 自动执行外循环,但我找不到任何有关实现内循环的信息。以下是我的最大努力:

void root(const float3 *v_in, float3 *v_out) {
  rs_allocation alloc = rsGetAllocation(v_in);
  uint32_t cnt = rsAllocationGetDimX(alloc);
  *v_out = 0;
  for(int i=0; i<cnt; i++)  
    *v_out += v_in[i];
}

但是在这里,当从 forEach_root() 调用时,rsGetAllocation() 会失败。

05-11 21:31:29.639: E/RenderScript(17032): ScriptC::ptrToAllocation, failed to find 0x5beb1a40

以防我添加在 Windows 下运行良好的OpenCL代码。我正在尝试将其移植到 Renderscript

typedef float4 wType;

__kernel void gravity_kernel(__global wType *src,__global wType *dst)
{
  int id = get_global_id(0);
  int count = get_global_size(0);
  double4 tmp = 0;
  for(int i=0;i<count;i++) {
    float4 diff = src[i] - src[id];
    float sq_dist = dot(diff, diff);
    float4 norm = normalize(diff);
    if (sq_dist<0.5/60)
      tmp += convert_double4(norm*sq_dist);
    else
      tmp += convert_double4(norm/sq_dist);
  }
  dst[id] = convert_float4(tmp);
}
4

1 回答 1

2

您可以提供除根函数之外的数据。在当前的 android 版本(4.2)中,您可以执行以下操作(这是图像处理场景中的一个示例):

渲染脚本片段:

#pragma version(1)
#pragma rs java_package_name(com.example.renderscripttests)

//Define global variables in your renderscript:
rs_allocation pixels;
int width;
int height;

// And access these in your root function via rsGetElementAt(pixels, px, py)
void root(uchar4 *v_out, uint32_t x, uint32_t y)
{
    for(int px = 0; px < width; ++px)
        for(int py = 0; py < height; ++py)
        {
            // unpack a color to a float4
            float4 f4 = rsUnpackColor8888(*(uchar*)rsGetElementAt(pixels, px, py));
            ...

Java 文件片段

// In your java file, create a renderscript:
RenderScript renderscript = RenderScript.create(this);

ScriptC_myscript script = new ScriptC_myscript(renderscript);

// Create Allocations for in- and output (As input the bitmap 'bitmapIn' should be used):
Allocation pixelsIn = Allocation.createFromBitmap(renderscript, bitmapIn,
         Allocation.MipmapControl.MIPMAP_NONE, Allocation.USAGE_SCRIPT);
Allocation pixelsOut = Allocation.createTyped(renderscript, pixelsIn.getType());

// Set width, height and pixels in the script:
script.set_width(640);
script.set_height(480);
script.set_pixels(pixelsIn);

// Call the for each loop:
script.forEach_root(pixelsOut);

// Copy Allocation to the bitmap 'bitmapOut':
pixelsOut.copyTo(bitmapOut);

您可以看到,在调用 forEach_root 函数计算“pixelsOut”的值时,输入“pixelsIn”之前已设置并在渲染脚本中使用。宽度和高度也是预先设置的。

于 2013-05-11T20:55:16.633 回答