0

我正在编写一个应用程序,允许用户在不同的着色器及其组合之间切换。因此,我想多次绘制完全相同的场景。

最后,所有的pass都应该合并成一个输出。结合我想使用 glblendfunc 的所有通行证,但我没有得到我想要的结果。

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
//use first shader
draw();
if (secondShaderWished) {
    //use second shader
    draw()
}

在每个绘图调用中,我绘制一个具有 alpha 值的纹理,例如透明区域。我得到的最终结果是,我主要看到最后一个渲染通道的效果,但在边界(alpha 值略微下降的地方)我确实看到了第一个着色器效果。我确实认为我应该使用第二个 glBlendFunc 来混合两个通道,但我想不出一种不接触任何 alpha 值的方法,这会破坏预期的效果。

我应该怎么办?除了 alphablending 还有什么别的吗?

编辑:我的目标是结合一个或多个传球。我想混合颜色(很可能将它们加在一起),因为每个路径中的颜色是通过以下混合函数跨不同层计算的:glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA)

编辑: 再次嗨!我正在解决这个问题,但我被卡住了。我不明白如何在任何着色器中正确设置 sampler2d ......我做错了什么?

glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, _FBO)
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, _Tex);
glViewport(0, 0, viewportSize.x(), viewportSize.y());
draw();
GLuint texLocation = glGetUniformLocation(_shader->getProgramID(),"pass0");
glUniform1i(texLocation, 0);
glBindTexture(GL_TEXTURE_2D, 0);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
4

2 回答 2

1

由于您的评论,您可以使用所需的混合功能将每个通道单独渲染为纹理(最好使用FBO完成)。然后,您只需绘制一个屏幕大小的四边形并在片段着色器中将所有通道的纹理平均在一起,就可以在一个通道中混合不同的通道。

编辑:根据您的评论。您将这些通道单独渲染到每个纹理(绑定为 FBO 附件)中。然后你使用像这样的片段着色器和屏幕大小的四边形,假设你有三个通道:

uniform sampler2D pass0;
uniform sampler2D pass1;
uniform sampler2D pass3;
uniform vec2 screenSize;

void main()
{
    vec2 texCoord = gl_FragCoord.xy / screenSize;
    gl_FragColor = (1.0/3.0) * (texture2d(pass0, texCoord) + 
                                texture2d(pass1, texCoord) + 
                                texture2d(pass2, texCoord));
}

编辑:或者,您可以使用简单的 1 纹理片段着色器(只需从单个纹理中查找颜色并将其输出)并使用 Tobias 的混合配置绘制多个纹理四边形。如果事先不知道通过次数,这也可以更好地扩展。

于 2011-09-07T10:46:28.587 回答
0

我认为您不想将纹理的 alpha 值用作混合因子,而是使用一个恒定因子,为您提供 1:1 的混合。

您必须在所有纹理层上分配混合因子。所以所有纹理上的白色像素加起来正好是 1。

float factor = 1.0f / numTextures;
glBlendColor(factor, factor, factor, factor);
glBlendFunc(GL_CONSTANT_COLOR, GL_ONE);

对于 3 层,将变为:

             source        dest
1st pass: (tex1 * 1/3) + (0 * 1)
2nd pass: (tex2 * 1/3) + (tex1 * 1/3 * 1)
3rd pass: (tex3 * 1/3) + ((tex2 * 1/3 + tex1 * 1/3) * 1)

还要记住,alpha 混合是一个依赖于顺序的操作。

于 2011-09-06T20:38:42.940 回答