2015-06-14 108 views
0

我想了解Renderscript。有人可以看看这段代码,让我知道in参数是什么?它不是一个分配对象,所以它是一个元素?为什么它是一个数组呢?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指向什么?第一个像素?所以如果我想访问下一个像素,我应该增加一个?

+0

多少位“在”确实有?我怎么知道它的大小?不管我输入的数字是多少,都不会引发出界错误 –

+0

* in只是您在Java中创建的单个单元格的占位符。你不能用它来索引[0]或* in以外的任何内容(这是等价的)。这同样适用于。 –

回答

2

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

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

+0

谢谢!我会使用你们的反馈并更改我的代码。事情现在更清楚了。 –

2

拉里的回答是如何处理这些向量数据的一个很好的解释。

你可以重写这个使用我们传递的价值,而不是风格要更加明确:

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; 
} 
+0

谢谢,斯蒂芬!欣赏反馈,并用价值参数版本的狗舍重写。 –

+0

我试过你的代码,我得到这个:/home/Projects/android/foo-master/app/src/main/rs/pixelsCalc.rs:8:17:error:expected';'在顶级声明器之后 –

+0

这就是说你在第8行第17列有一个错字。上面写的代码对llvm-rs-cc来说工作得很好。 –