Проблема смешивания изображений при рендеринге в текстуру - PullRequest
2 голосов
/ 23 августа 2009

Это связано с моим последним вопросом . Чтобы получить это изображение:

http://img252.imageshack.us/img252/623/picture8z.png

  1. Я рисую белый фон (цвет = (1, 1, 1, 1)).

  2. Я рендеринг в текстуру двух верхних левых квадратов с цветом = (1, 0, 0, .8) и функции смешивания (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA), а затем рисую текстуру с цветом = (1, 1, 1, 1) и функции смешивания (GL_ONE, GL_ONE_MINUS_SRC_ALPHA).

  3. Я рисую нижний правый квадрат с цветом = (1, 0, 0, .8) и функцией смешивания (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA).

По моим расчетам, квадраты рендеринга в текстуру должны иметь цвет

.8 * (1, 0, 0, .8) + (1 - .8) * (0, 0, 0, 0) = (.8, 0, 0, .64)

и так после рисования этой текстуры на белом фоне, они должны иметь цвет

(.8, 0, 0, .64) + (1 - .8) * (1, 1, 1, 1) = (1, .2, .2, .84)

и нижний правый квадрат должен иметь цвет

.8 * (1, 0, 0, .8) + (1 - .8) * (1, 1, 1, 1) = (1, .2, .2, .84)

который должен выглядеть так же! Мое рассуждение неверно? Мои вычисления неверны?

В любом случае, моя цель - кэшировать часть моей сцены. Как мне сделать рендеринг в текстуру, а затем нарисовать эту текстуру так, чтобы она была эквивалентна простой прорисовке сцены?

Ответы [ 3 ]

4 голосов
/ 23 августа 2009

Если вы хотите отобразить смешанный контент в текстуру и скомбинировать эту текстуру с экраном, самый простой способ - везде использовать предварительно умноженную альфа. Относительно просто показать, что это работает для вашего случая: цвет ваших полупрозрачных квадратов в предварительно умноженной форме равен (0,8, 0, 0, 0,8), и смешивая это с (0, 0, 0, 0) с (GL_ONE, GL_ONE_MINUS_SRC_ALPHA) по существу передает цвет ваших квадратов в текстуру. Смешивание (0,8, 0, 0, 0,8) с непрозрачным белым с (GL_ONE, GL_ONE_MINUS_SRC_ALPHA) дает вам (1,0, 0,2, 0,2, 1,0). Обратите внимание, что цветовые каналы такие же, как при третьем вычислении, но альфа-канал по-прежнему равен 1,0, что вы и ожидаете от непрозрачного объекта, покрытого смешанным объектом.

У Тома Форсайта есть хорошая статья о предварительно умноженной альфе. Все это стоит прочитать, но см. Раздел «Составление полупрозрачных слоев» для объяснения того, почему математика работает в общем случае.

0 голосов
/ 23 августа 2009

Относительно вашего последнего вопроса: Замена частей сцены текстурами не тривиальна. Хорошая отправная точка - докторская диссертация Стефана Йешке .

0 голосов
/ 23 августа 2009

Упс, мои вычисления неверны! вторая строка должна быть

(.8, 0, 0, .64) + (1 - .64) * (1, 1, 1, 1) = (1, .36, .36, .84)

что действительно соответствует тому, что я вижу (когда я изменяю последний квадрат на цвет (1, .2, .2, .8), все три квадрата выглядят одинаково).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...