我对renderscript还不熟悉,而且我的第一个脚本出现了显著的问题。据我所见(从我插入的调试语句中),我的代码运行良好,但是当通过allocation.copyto(bitmap)方法将计算值复制回位图时,它们会被损坏。
我把奇怪的颜色弄出来了,所以最后把我的脚本剥离到这个显示问题的示例中:
void root(const uchar4 *v_in, uchar4 *v_out, const void *usrData, uint32_t x, uint32_t y)
{
*v_out = rsPackColorTo8888(1.f, 0.f, 0.f, 1.f);
if (x==0 && y==0) {
rsDebug("v_out ", v_out->x, v_out->y, v_out->z, v_out->w);
}
}
这里我们只是写出一个不透明的红色像素。调试行似乎打印了正确的值(255 0 0 255),实际上我在位图中得到了一个红色像素。
但是,如果我稍微更改红色像素上的alpha:
*v_out = rsPackColorTo8888(1.f, 0.f, 0.f, 0.998f);
调试打印(255 0 0 254)这似乎仍然是正确的,但最终的像素值是(0 0 0 254)即黑色。
很明显,我怀疑这是一个有预谋的alpha问题,但我的理解是,从位图复制到位图的分配例程应该为您处理这个问题。至少这是切特·哈斯在这篇博文中建议的:https://plus.google.com/u/0/+ChetHaase/posts/ef6Deey6xKA。
此外,没有一个例子计算脚本似乎提到任何问题与预乘阿尔法。我的脚本基于来自sdk的hellocomputer示例。
如果我犯了一个错误,我希望RS的导师能为我指出。
遗憾的是,在2年多之后,renderscript的文档仍然很差。
另外,我使用的位图是argb_888,我是在sdk18(android 4.3)上构建和定位的。
最佳答案
该示例运行良好,因为该示例不修改alpha。
如果要修改alpha,然后将分配用作普通位图,则应返回(r*a,g*a,b*a,a)。
但是,如果将分配发送到未预乘的总账表,则代码将按原样工作。