Название: Запутался с альфа-каналом :) Отправлено: 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) никак не учитывается и никак не накапливается. Конечно Вы можете сказать "да зачем сотый раз объяснять как работает альфа маска - это и дураку понятно" - и это правда :) Просто по опыту знаю - если сразу изложу задачу, то непонятки неизбежны (мол, а ты не объяснил и все такое). Поэтому если есть квешнзы - задавайте сейчас, сначала все выясним, а потом перейдем к тому "а что же надо сделать". Спасибо |