我刚接触过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。
此外,没有一个例子的计算脚本似乎提到任何问题与前乘alpha。我的脚本基于SDK的HelloComputer示例。
如果我犯了一个错误,我希望RS专家能为我指出这一点。
遗憾的是,在2+年之后,Renderscript的文档仍然如此贫乏。
PS。我使用的位图是ARGB_888,我正在SDK18上构建和运行(Android4.3)
发布于 2013-08-06 22:18:45
该示例工作正常,因为该示例不修改alpha。
如果要修改alpha,然后将分配用作普通位图,则应返回(r*a、g*a、b*a、a)。
但是,如果您将分配发送到一个未预先乘以的GL面,则您的代码将按原样工作。
https://stackoverflow.com/questions/18079898
复制相似问题