2015-06-14 112 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來說工作得很好。 –