2016-04-13 4 views
0

Я пытаюсь воспроизвести эффекты довольно сложной операции смешивания (исправлено).Рефакторинг сложной смеси opengl

(1-(1-src_alpha)*dest_alpha)*src+(1-src_alpha)*dest_alpha*dest 

src и dest относятся к соответствующим компонентам Rgba в буферах источника и назначения. То, что я хотел бы сделать, это превратить это в цепочку смесей, используя glBlendFunc и/или glBlendFuncSeparate, которые могут быть вызваны для получения того же результата, что и выше, возможно, путем рендеринга одной и той же сцены более одного раза, после каждого вызова glBlend*. Хотя я, к сожалению, не могу выполнить сложную смесь как один звонок glBlend*, мне кажется, что я все еще смогу добиться эффекта, который я получаю, многократно создавая свою сцену, используя разные параметры glBlend*. Я думаю, что мне могут понадобиться 3 таких звонка, но это возможно сделать в два раза.

Edit:

Чтобы понять, что функция смесь делает, рассмотрим первый регулярный альфа смешаться src * src_alpha + dest * (1 - src_alpha). Этот стиль смешивания отлично подходит для практически всех альфа-смешивания, где источник еще не содержит предварительно умноженной альфы, и особенно когда мы оказываемся на конечном устройстве, таком как экран или другое устройство, где пункт назначения явно или иначе может быть принят быть непрозрачным.

Если пункт назначения уже непрозрачен, то эта сложная функция смешения даст те же результаты, что и вышеупомянутая функция общего смешивания, оставив объект назначения непрозрачным, а если назначение будет полностью прозрачным, функция сложного смешения ухудшится к исходной копии и вместо этого наследует прозрачность источника. То, что на самом деле делает сложная функция смешения, просто линейно интерполируется между этими двумя крайностями, основанными на целевой альфа.

Редактировать: необходимо исправить функцию смешивания выше ... Я неправильно ее оценил. Я показываю вывод ниже для проверки:

Во-первых, я начинаю с основной функцией смеси:

src * src_alpha + dest * (1 - src_alpha) 

И то, что я хочу сделать, это смешать что с СРК, в зависимости от dest_alpha, так выше функция умножается на dest_alpha, и я добавлю, что к источнику, умноженной на 1 - dest_alpha, следующим образом:

src * (1-dest_alpha) + (src * src_alpha + dest * (1 - src_alpha)) * dest_alpha 

Рефакторинг арифметически дает мне это:

(1-(1-src_alpha)*dest_alpha)*src+(1-src_alpha)*dest_alpha*dest 
+1

Что вы хотите, чтобы ваша целевая альфа стала, как только это будет завершено? –

+1

Не можете ли вы использовать шейдер, чтобы сделать это вычисление для вас, а затем использовать некоторую функцию блендера для рендеринга квадроцикла? Я не знаком с смешением вообще, так что просто интересно. – Jas

+1

@Jas: Смешивание - одна из тех вещей, которые не могут делать шейдеры (на основе треугольника при рисовании) - это жесткие схемы в графических процессорах. Конечно, OP может фактически компоновать картинку из нескольких слоев, и в этом случае это уже не смешивание, а композиция. – datenwolf

ответ

0

Я понял это, так что если кто-то есть какой-либо необходимости в этом, вот что я обнаружил:

Во-первых, я называю

glblendfuncseparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ZERO, GL_ONE) 

Затем я рисую сцену нормально. Это дает то, что было бы правильным сочетанием цветов на цветовых каналах, предполагая, что источник имел непремультиплексную альфа и смешивался с непрозрачным фоном. Хотя оригинальный альфой Desination хранится, поэтому его можно использовать на следующем шаге:

glblendfuncseparate(GL_ONE_MINUS_DST_ALPHA, GL_DST_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA) 

А потом я перекроить точно такую ​​же сцену, как и раньше.Это дополнительно линейно интерполирует цветовые каналы между исходным источником и приведенным выше смешанным результатом на основе целевого альфа и объединяет альфа-компоненты таким образом, что результат всегда больше или равен либо исходной, либо целевой альфа, но по-прежнему всегда ограничено от 0 до 1, точно так же, как и исходные и целевые альфа-значения.

Смежные вопросы