2013-04-01 9 views
2

Я использую glBindFragDataLocationIndexed() и записываю два цвета в шейдере фрагментов. Ниже мой код:Использование GL_SRC1_COLOR в glBlendFunc()

glBindFragDataLocationIndexed(shader_data.psId, 0, 0, "Frag_Out_Color0"); 
glBindFragDataLocationIndexed(shader_data.psId, 0, 1, "Frag_Out_Color1"); 

glActiveTexture (GL_TEXTURE0); 
LoadTexture(texture1);  
glBindTexture (GL_TEXTURE_2D, tex_id1); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,width, height, 0, GL_RGBA,GL_UNSIGNED_BYTE, texture1_data); 

glActiveTexture (GL_TEXTURE1); 
LoadTexture(texture2); 
glBindTexture (GL_TEXTURE_2D, tex_id2); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,width, height, 0, GL_RGBA,GL_UNSIGNED_BYTE, texture2_data); 


glEnable(GL_BLEND); 
glBlendFunc(GL_SRC_COLOR, GL_SRC1_COLOR); 

glDrawArrays(GL_TRIANGLE_FAN, 0, 4); 

Фрагмент шейдера:

#version 150 
in vec2 texcoord; 

uniform sampler2D basetexture1; 
uniform sampler2D basetexture2; 

out vec4 Frag_Out_Color0; 
out vec4 Frag_Out_Color1; 

void main(void) 
{ 
    Frag_Out_Color0 = texture2D(basetexture1, texcoord); 

    Frag_Out_Color1 = texture2D(basetexture2, texcoord); 

} 

OGL3.3 спецификация говорит, что:

Data written to the first of these outputs becomes the first source 
color input to the blender (corresponding to SRC_COLOR and SRC_ALPHA). Data 
written to the second of these outputs generates the second source color input to 
the blender (corresponding to SRC1_COLOR and SRC1_ALPHA). 

Я прошел GL_SRC_COLOR, GL_SRC1_COLOR в качестве вклада в glBlendFunc(). Я не уверен, правильный результат или нет. Пожалуйста, найдите прилагаемые изображения. Также, если я передаю GL_ONE, GL_ONE, визуализируется только первая текстура и никаких признаков второй текстуры вообще. Как я могу проверить, что остальная часть моего кода в порядке (и смешение выполнено правильно)?

Ниже приведены текстуры 1, текстуры 2 и результат соответственно.

Texture 1Texture 2Result

+0

http://www.andersriggelsen.dk/glblendfunc.php – elect

ответ

3

Ваш результат можно было бы ожидать, если предположить, что цвет назначения является черным. Непонятно, что именно вы намерены делать glBlendFunc(GL_SRC_COLOR, GL_SRC1_COLOR);. Но что он будет делать, это what blending always does.

Коэффициент источника (GL_SRC_COLOR) будет умножен на исходный цвет (или, точнее, цвет source0). Коэффициент назначения (GL_SRC1_COLOR) будет умножен на цвет назначения. Результаты этих умножений будут добавлены вместе.

В вашем случае это означает, что цвет источника будет умножен на сам (что делает результат темнее). Цвет назначения будет умножен на цвет источника1; если пункт назначения равен нулю, вы получаете 0. Следовательно, вы получаете исходный цвет, умноженный на себя как результат.

Dual source blending только полезным (в том, что это то, что вы не могли бы сделать в вашем шейдере), если вам необходимо выполнить некоторые операции между двумя исходными цветами и назначения цвета. Если это может быть выражено как (Src0 op Src1) op Dest, то это то, что вы должны делать в своем шейдере.

+0

Итак, если я передаю (GL_ONE, GL_ZERO) и (GL_ZERO, GL_ONE) в glBlendFunc(), я должен получить две разные текстуры в качестве вывода, которые были переданы в качестве входов (source0 и source1). Но этого не происходит. (GL_ZERO, GL_ONE) не дает мне никакого вывода (черный экран) и (GL_ONE, GL_ZERO) дает мне первую текстуру в качестве выхода. Итак, я думаю, что что-то не так с кодом, поскольку источник 1 неверен. – maverick9888

+0

@ maverick9888: Нет. Исходный * коэффициент * умножается на source0 * color *. А коэффициент * цели * умножается на пункт назначения * цвет *. Факторы - это ваши параметры для 'glBlendFunc'. Вы можете контролировать * часть * уравнения; это всегда между цветами source0 и destination. –

+0

: (GL_ONE, GL_ZERO) и (GL_ZERO, GL_ONE), похоже, генерируют две текстуры, как я предсказывал, если я использую простое смешивание и не использую GL_SRC1_COLOR (например, в качестве адресата используем содержимое фреймбуффера и новую геометрию в качестве источника). Являются ли эти уравнения смешивания различными, когда дело доходит до (Src0 op Src1)? Также, если я обозначаю второй цвет GL_SRC1_COLOR, каково будет значение GL_DST_COLOR в glBlendFunc()? – maverick9888