Opengl 在glBlendFunc()中使用GL_SRC1_颜色

Opengl 在glBlendFunc()中使用GL_SRC1_颜色,opengl,opengl-3,blending,color-blending,Opengl,Opengl 3,Blending,Color Blending,我正在使用glbindfragdataLocationIndex()并在片段着色器中编写两种颜色。以下是我的代码: glBindFragDataLocationIndexed(shader_data.psId, 0, 0, "Frag_Out_Color0"); glBindFragDataLocationIndexed(shader_data.psId, 0, 1, "Frag_Out_Color1"); glActiveTexture ( GL_TEXTURE0 ); LoadTextur

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

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和结果


假设目标颜色为黑色,您的结果就是预期的结果。不清楚您到底想要什么
glBlendFunc(GL\u SRC\u COLOR,GL\u SRC1\u COLOR)要做的事。但它将要做的是

源因子(
GL\u SRC\u COLOR
)将乘以源颜色(或者更准确地说,是源0颜色)。目标系数(
GL\u SRC1\u COLOR
)将乘以目标颜色。这些乘法的结果将相加

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


仅在需要在两种源颜色和目标颜色之间执行某些操作时才有用(因为这是着色器中无法执行的操作)。如果它可以表示为
(Src0 op Src1)op Dest
,那么这就是您应该在着色器中执行的操作。

因此,如果我将(GL_-ONE,GL_-ZERO)和(GL_-ZERO,GL_-ONE)传递给glBlendFunc(),我应该得到两个不同的纹理作为输出,作为输入传递(source0和source1)。但事实并非如此。(GL_-ZERO,GL_-ONE)根本不给我任何输出(黑屏),而(GL_-ONE,GL_-ZERO)给我第一个纹理作为输出。所以我认为代码有问题,因为源代码1不正确。@maverick9888:没有。源代码因子乘以源代码0的颜色。目标因子乘以目标颜色。这些因素是
glBlendFunc
的参数。你只能控制方程的一部分;它总是在源颜色0和目标颜色之间。:(GL_ONE,GL_ZERO)和(GL_ZERO,GL_ONE)似乎会生成两个纹理,正如我前面所说的,如果我使用简单混合而不使用GL_SRC1_颜色(即使用帧缓冲区内容作为目标,使用新几何体作为源)。当涉及到(Src0 op Src1)时,这些混合方程是否不同?另外,如果我用GL_SRC1_color表示第二种颜色,那么GL_DST_color在glBlendFunc()中的意义是什么?@maverick9888:“生成两种纹理”是什么意思?你没有生成纹理;你在渲染什么东西。所以不清楚你们在说什么。对不起,我的意思是说它创建了两个不同的输出,其中包含我要传递给着色器的纹理。