Allocation.copyTo (Bitmap), искажающий значения пикселей

Я новичок в 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), и действительно, я получаю красный пиксель в растровом изображении.

Однако, если я слегка изменил альфу на красном пикселе:

 *v_out = rsPackColorTo8888(1.f, 0.f, 0.f, 0.998f); 

Отладочные отпечатки (255 0 0 254), которые все еще кажутся правильными, но конечное значение пикселя заканчивается (0 0 0 254), т.е. черный.

Очевидно, я подозревал, что это была премультипликационная альфа-проблема, но я понимаю, что подпрограммы Allocation для копирования из и в Bitmaps должны обрабатывать это для вас. По крайней мере, это то, что предлагает Chet Haase в этом блоге: https://plus.google.com/u/0/+ChetHaase/posts/ef6Deey6xKA .

Кроме того, ни один из примеров сценариев вычислений, кажется, не упоминает о каких-либо проблемах с заранее умноженной альфой. Мой скрипт был основан на примере HelloComputer из SDK.

Если я ошибаюсь, я бы хотел, чтобы гуру РС указал на меня.

Жаль, что через 2 года документация для Renderscript по-прежнему так бедна.

PS. Растровые изображения, которые я использую, это ARGB_888, и я создаю и настраиваю на SDK18 (Android 4.3)

Пример отлично работает, потому что пример не изменяет альфа.

Если вы собираетесь изменить альфа, а затем использовать Распределение в качестве нормального растрового изображения, вы должны вернуться (r * a, g * a, b * a, a).

Тем не менее, если вы отправляете выделение на поверхность GL, которая не была предварительно умножена, ваш код будет работать как есть.