Я новичок в Renderscript, и у меня возникают проблемы с моим первым скриптом. Насколько я могу судить (из вставленных мной отладочных операторов) мой код работает нормально, но вычисленные значения искажаются, когда они копируются обратно в Bitmap методом 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), т.е. чернить.
Очевидно, я подозревал, что это была проблема с предустановленной альфа-версией, но я понимаю, что процедуры распределения для копирования из и в растровые изображения должны справиться с этим за вас. По крайней мере, именно это предлагает Чет Хаасе в этом сообщении блога: https://plus.google.com/u/0/+ChetHaase/posts/ef6Deey6xKA.
Также ни один из примеров вычислительных скриптов, похоже, не упоминает никаких проблем с предварительно умноженным альфа. Мой сценарий был основан на примере HelloComputer из SDK.
Если я совершаю ошибку, я хотел бы, чтобы гуру RS указал мне на это.
Жалко, что спустя более двух лет документация по Renderscript все еще остается такой плохой.
PS. Я использую растровые изображения ARGB_888, и я создаю и ориентируюсь на SDK18 (Android 4.3).