在 OpenGL 中,有没有办法根据着色器中单独通道的值进行混合?

In OpenGL, is there a way to blend based on a separate channel's value in the shader?

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

您需要双源混合,它在 OpenGL 3.3 的核心中可用。这允许您提供具有两个输出的片段着色器,并在混合函数中使用它们。

您可以像这样在片段着色器中声明输出:

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

或非预乘alpha:

glBlendFunc(GL_SRC1_COLOR, GL_ONE_MINUS_SRC1_COLOR);

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