Renderscript 文档和建议 - Android

Renderscript Documentation and Advice - Android

我一直在关注如何在 Android 上使用渲染脚本的指南。

http://www.jayway.com/2014/02/11/renderscript-on-android-basics/

我的代码是这样的(我得到了脚本的包装器 class):

public class PixelCalcScriptWrapper {

    private Allocation inAllocation;
    private Allocation outAllocation;
    RenderScript rs;
    ScriptC_pixelsCalc script;

    public PixelCalcScriptWrapper(Context context){
        rs = RenderScript.create(context);
        script = new ScriptC_pixelsCalc(rs, context.getResources(), R.raw.pixelscalc);
    };

    public void setInAllocation(Bitmap bmp){
        inAllocation = Allocation.createFromBitmap(rs,bmp);
    };

    public void setOutAllocation(Bitmap bmp){
        outAllocation = Allocation.createFromBitmap(rs,bmp);
    };

    public void forEach_root(){
        script.forEach_root(inAllocation, outAllocation);
    }
}

此方法调用脚本:

public Bitmap processBmp(Bitmap bmp, Bitmap bmpCopy) {

    pixelCalcScriptWrapper.setInAllocation(bmp);
    pixelCalcScriptWrapper.setOutAllocation(bmpCopy);
    pixelCalcScriptWrapper.forEach_root();

    return bmpCopy;
};

这是我的脚本:

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

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

    if(pixel.z < 128) {
        pixel.z = 0;
    }else{
        pixel.z = 255;
    }
    if(pixel.y < 128) {
        pixel.y = 0;
    }else{
        pixel.y = 255;
    }
    if(pixel.x < 128) {
        pixel.x = 0;
    }else{
        pixel.x = 255;
    }

    out->xyz = convert_uchar3(pixel);
}

现在在哪里可以找到有关此的文档?

例如,我有这些问题:

1) 这个 convert_float4(in[0]) 有什么作用?

2) 这里convert_float4(in[0]).rgb;rgbreturn是什么意思?

3) 什么是 float3

4) 这行我不知道从哪里开始 out->xyz = convert_uchar3(pixel);

5) 我假设在参数中,inout 分配是否已通过? xy 是什么?

1) 在内核中,in指针是一个4元素的unsigned char,即表示一个像素颜色,R、G、B、A值在0-255范围内。所以 convert_float4 只是将四个 uchar 中的每一个都转换为 float。在您使用的这个特定代码中,使用浮点数可能没有多大意义,因为您正在做一个简单的阈值,而且您也可以直接使用 uchar 数据。在执行需要额外精度的其他类型的图像处理算法时,使用浮点数更好(例如:模糊图像)。

2) .rgb 后缀是 shorthand 到 return 只有 float4 的前三个值,即 R、G 和 B 值。如果你只使用 .r 它会给你第一个值作为常规 float,如果你使用 .g 它会给你第二个值作为 float,等等...然后将这三个值分配给 float3 变量,该变量现在表示只有三个颜色通道(即没有 A alpha 通道)的像素。

3) 参见#2。

4) 现在 convert_uchar3 又是另一个将 float3 像素变量转换回 uchar3 变量的转换。您正在按顺序将这三个值分配给 x、y 和 z 元素中的每一个。现在可能是提及 X、Y 和 Z 与 R、G 和 B 完全可以互换的好时机。该语句也可以使用 out->rgb,而且实际上这样会更具可读性。请注意 out 是一个 uchar4,通过这样做,您只分配了该指针中的前三个 "rgb" 或 "xyz" 元素,第四个元素在这里未定义.

5) 是的,in是输入像素,out是输出像素。那么xy就是像素点在整幅图像中的x、y坐标。对于您正在处理的 image/allocation 中的每个像素,将调用一次此内核函数,因此在处理图像时知道您所处的坐标通常是件好事。在这个特定的例子中,因为它只是以相同的方式对所有像素进行阈值处理,所以坐标是无关紧要的。

关于 RenderScript 的好的文档很难找到。不过,我强烈建议您看一下这两个视频,因为它们会让您更好地了解 RenderScript 的工作原理:

AnDevCon: A Deep Dive into RenderScript

Google I/O 2013 - High Performance Applications with RenderScript

请记住,这两个视频都有几年的历史了,因此最近的 API 上的一些小细节可能有所变化,但总的来说,这些可能是 RS 的最佳信息来源。

http://developer.android.com/guide/topics/renderscript/reference/rs_convert.html#android_rs:convert

这个convert_float4(in[0])是做什么的? convert_float4 将从 uchar4 转换为 float4; .rgb 将它变成前 3 个元素的 float3。

rgb是什么return? RenderScript 矢量类型有 .r .g .b .a 或 .x .y .z .w 分别代表第一个、第二个、第三个和第四个元素。您可以使用任何组合(例如 .xy 或 .xwy)

什么是 float3? float3 是一个 "vector type" 有点像浮点数,但有 3 个。 float 有 float2、float3 和 float4 向量类型。 (还有uchar4、int4等)

http://developer.android.com/guide/topics/renderscript/reference/overview.html 可能会有帮助

希望对您有所帮助。