在glBlendFunc()中使用GL_SRC1_COLOR

时间:2013-04-01 07:15:29

标签: opengl opengl-3 blending color-blending

我正在使用glBindFragDataLocationIndexed()并在片段着色器中写入两种颜色。以下是我的代码:

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);

Fragment Shader是:

#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 1 Texture 2 Result

1 个答案:

答案 0 :(得分:3)

假设目标颜色为黑色,您的结果就是您所期望的结果。目前还不清楚你打算做什么glBlendFunc(GL_SRC_COLOR, GL_SRC1_COLOR);。但它将做的是what blending always does

源因子(GL_SRC_COLOR)将乘以源颜色(或者更准确地说,是source0颜色)。目标因子(GL_SRC1_COLOR)将乘以目标颜色。这些乘法的结果将加在一起。

在您的情况下,这意味着source0颜色将乘以本身(因此使结果更暗)。目标颜色将乘以source1颜色;如果目的地为零,则得到0.因此,您将source0颜色乘以其自身作为输出。

如果您需要在两种源颜色和目标之间执行某些操作,

Dual source blending只是有用的(因为它是您在着色器中无法做到的事情) 颜色。如果它可以表示为(Src0 op Src1) op Dest,那么您应该在着色器中执行此操作。