在OpenGL中,是否有一种基于单独通道的混合方法';着色器中的s值?

在OpenGL中,是否有一种基于单独通道的混合方法';着色器中的s值?,opengl,graphics,fragment-shader,Opengl,Graphics,Fragment Shader,在OpenGL(不是ES)中,在基于另一个纹理或变量的值进行绘制时,是否有一种通用的方法来基于纹理进行混合?在OpenGLES上,我知道我可以通过GL\u EXT\u shader\u framebuffer\u fetch等扩展在某些平台上进行自定义混合。我问这个问题的原因是,我有一个特殊的纹理,其中第四个通道不是alpha,我需要能够在不同地图上可用的单独alpha上混合它。您想要双源混合,从OpenGL 3.3开始在core中可用。这允许您提供具有两个输出的片段着色器,并在混合函数中使用这

在OpenGL(不是ES)中,在基于另一个纹理或变量的值进行绘制时,是否有一种通用的方法来基于纹理进行混合?在OpenGLES上,我知道我可以通过GL\u EXT\u shader\u framebuffer\u fetch等扩展在某些平台上进行自定义混合。我问这个问题的原因是,我有一个特殊的纹理,其中第四个通道不是alpha,我需要能够在不同地图上可用的单独alpha上混合它。

您想要双源混合,从OpenGL 3.3开始在core中可用。这允许您提供具有两个输出的片段着色器,并在混合函数中使用这两个输出

您可以在片段着色器中声明输出,如下所示:

layout(location = 0, index = 0) out vec4 outColor;
layout(location = 0, index = 1) out vec4 outAlpha;
然后可以像这样设置混合函数,用于预乘alpha:

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC1_COLOR);
glBlendFunc(GL_SRC1_COLOR, GL_ONE_MINUS_SRC1_COLOR);
或非预乘阿尔法:

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC1_COLOR);
glBlendFunc(GL_SRC1_COLOR, GL_ONE_MINUS_SRC1_COLOR);

请注意,
SRC1
这里是片段着色器的第二个输出。如果我记得正确,这种混合将只适用于一个位置。

“如果我记得正确,这种混合将只适用于一个位置。”对于所有实际目的来说,这是正确的。但这是一个硬件限制,而不是API限制。可以,这在不使用非双源混合时是一个不同的限制。只是,对于几乎所有支持它的当前硬件,该限制将为1。是的,Dolphin使用该扩展作为双源混合的后备: