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

Я новичок в 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).


person Paul LeBeau    schedule 06.08.2013    source источник
comment
как насчет того, чтобы вы просто изменили значения RGB, а не альфа?   -  person Onur A.    schedule 06.08.2013
comment
Проблема заключается в изменении альфы. Я, наверное, этого не прояснил. Пока альфа преобразуется в 255, все в порядке. Если это что-то еще, пиксели искажаются.   -  person Paul LeBeau    schedule 06.08.2013
comment
Поскольку другие примеры, по-видимому, отлично подходят для других людей, мне интересно, проблема ли это в Android 4.3 или, может быть, в ADT 20.0.5.   -  person Paul LeBeau    schedule 06.08.2013
comment
как вы создаете перераспределение? createFromBitmap? какие флаги использования?   -  person Tim Murray    schedule 06.08.2013
comment
Allocation.createFromBitmap (mRS, bm) для mIn и Allocation.createTyped (mRS, mIn.getType ()) для mOut   -  person Paul LeBeau    schedule 07.08.2013
comment
Я просто попытался вернуться к тому, что делает пример HelloCompute (createFromBitmap (mRS, maskedContent, Allocation.MipmapControl.MIPMAP_NONE, Allocation.USAGE_SCRIPT)), но это не имело никакого значения.   -  person Paul LeBeau    schedule 07.08.2013
comment
это может быть подозрение, которое вы подумали, похоже на проблему с пикселями перед умножением, а также может быть проблема с 4.3, пробовали ли вы с уровнями ниже api, например, 4.2.2 или 4.1.2?   -  person Onur A.    schedule 07.08.2013
comment
Только что нашел аппарат 4.2.1. Я получаю тот же результат (красный пиксель становится черным).   -  person Paul LeBeau    schedule 07.08.2013
comment
Очевидно, это должно быть я делаю что-то не так, потому что Ромен Гай только что закрыл мой отчет об ошибке (goo.gl/rmSdA0). К сожалению, это произошло без каких-либо объяснений, поэтому я все еще в неведении.   -  person Paul LeBeau    schedule 07.08.2013


Ответы (1)


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

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

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

person R. Jason Sams    schedule 06.08.2013