Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: Igors от Октябрь 22, 2011, 16:59



Название: Запутался с альфа-каналом :)
Отправлено: Igors от Октябрь 22, 2011, 16:59
Добрый день

Возникла совсем простенькая задачка которую однако решить не смог  :) Сначала хочу объяснить "исходную" - то что не вызывает никаких вопросов.

Есть исходный ARGB имедж (src). К нему применяются цепочки преобразований, назовем их "фильтры" (flt). Каждый фильтр - это еще один имедж + правило по которому он комбинируется с исходным имеджем. Результат фильтра подается как src для следующего фильтра. Для примера возьмем 2 простейших фильтра

1) Replace (src = flt). RGB исходного имеджа заменяются новыми
2) Multiply  (src *= flt). RGB исходного имеджа умножаются на фильтр, результат подсекается до 1.0

Теперь причем здесь альфа. Для исходного имеджа она никак не учитывается - считаем что она всегда = 1. А вот альфа фильтра определяет "интенсивность" его применения. Примеры

- if (flt.a <= 0.0f)  // фильтр не применяется вообще, пиксель остается неизменным
  continue

- if (flt.a >= 1.0f)  // фильтр применяется полностью
  src = DoFilter(src, flt);

- if (flt.a > 0.0f && flt.a < 1.0)  // фильтрованное значение смешивается с исходным по альфе фильтра
  src = DoFilter(src. flt) * flt.a + src * (1.0f - flt.a);

Еще пример: исходный имедж был 100% синим, применяется красный фильтр с альфа 50%. Результат (0.5, 0.0, 0.5) - фиолетовый 50%. Альфа исходного имеджа (src) никак не учитывается и никак не накапливается.

Конечно Вы можете сказать "да зачем сотый раз объяснять как работает альфа маска - это и дураку понятно" - и это правда  :) Просто по опыту знаю - если сразу изложу задачу, то непонятки неизбежны (мол, а ты не объяснил и все такое). Поэтому если есть квешнзы - задавайте сейчас, сначала все выясним, а потом перейдем к тому "а что же надо сделать".

Спасибо