2016-10-16 2 views
0

Я хочу использовать Alpha Blending (SRC_ALPHA, ONE_MINUS_SRC_ALPHA), которая в принципе это:Cg шейдеры Alpha Blending

frag_out.aaaa * frag.out + ((1.0, 1.0, 1.0, 1.0) - frag_out.aaaa) * pixel_color 

Допустим цвет пикселя уже на экране (1.0, 1.0, 1.0, 1.0) Цвет я в настоящее время рендера (1.0, 1.0, 1.0, 0.4)

Когда я делаю это, полученный цвет на экране имеет альфа 0.76 (даже если он был полностью непрозрачен ПЕРЕД)

Действительно:

(0.4, 0.4, 0.4, 0.4) * (1.0, 1.0, 1.0, 0.4) + (0.6, 0.6, 0.6, 0.6) * (1.0, 1.0, 1.0, 1.0) = (1.0, 1.0, 1.0, 0.76) 

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

(0.4, 0.4, 0.4, 1.0) * (1.0, 1.0, 1.0, 0.4) + (0.6, 0.6, 0.6, 0.6) * (1.0, 1.0, 1.0, 1.0) = (1.0, 1.0, 1.0, 1.0) 

Можно ли достичь этого? Если да, то как?

ответ

3

Это вполне возможно при использовании OpenGL 3.0 и выше, поскольку функции бленды могут там быть установлены отдельно для RGB и A. В вашем случае это будет

glBlendFuncSeparate(GL_SOURCE_ALPHA, GL_ONE_MINUS_SOURCE_ALPHA, GL_ONE, GL_ONE); 

Последний параметр, определяющий коэффициент смешивания для назначения альфа, возможно, придется адаптировать, так как вы не указали поведение для адресата alpha < 1. Для получения дополнительной информации см. function documentation.

+0

Спасибо! Вы знаете, как указать этот тип смешивания на языке CG Shading? – Terko

+0

Извините, никогда не использовал CG. – BDL