Я пытаюсь воспроизвести эффекты довольно сложной операции смешивания (исправлено).Рефакторинг сложной смеси 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
Что вы хотите, чтобы ваша целевая альфа стала, как только это будет завершено? –
Не можете ли вы использовать шейдер, чтобы сделать это вычисление для вас, а затем использовать некоторую функцию блендера для рендеринга квадроцикла? Я не знаком с смешением вообще, так что просто интересно. – Jas
@Jas: Смешивание - одна из тех вещей, которые не могут делать шейдеры (на основе треугольника при рисовании) - это жесткие схемы в графических процессорах. Конечно, OP может фактически компоновать картинку из нескольких слоев, и в этом случае это уже не смешивание, а композиция. – datenwolf