5

我是 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 问题,但我的理解是,从位图复制到位图的分配例程应该为您处理。至少这就是 Chet Haase 在这篇博文中的建议:https: //plus.google.com/u/0/+ChetHaase/posts/ef6Deey6xKA

此外,那里的示例计算脚本似乎都没有提到预乘 alpha 的任何问题。我的脚本基于 SDK 中的 HelloComputer 示例。

如果我犯了错误,我希望 RS 大师为我指出。

遗憾的是,经过 2 年多的时间,Renderscript 的文档仍然很差。

PS。我正在使用的位图是 ARGB_888,我正在 SDK18 (Android 4.3) 上构建和定位

4

1 回答 1

3

该示例工作正常,因为该示例不修改 alpha。

如果要修改 alpha,然后将分配用作普通位图,则应返回 (r*a, g*a, b*a, a)。

但是,如果您将分配发送到未预乘的 GL 表面,则您的代码将按原样工作。

于 2013-08-06T22:18:45.097 回答