我正在编写一个应用程序,允许用户在不同着色器之间切换,以及它们的组合 . 因此,我希望多次绘制完全相同的场景 .
最后,所有通道应合并为一个输出 . 要结合我考虑使用glblendfunc的所有传球,但我没有得到我想要的结果 .
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
//use first shader
draw();
if (secondShaderWished) {
//use second shader
draw()
}
在每次绘制调用中,我绘制一个具有alpha值的纹理,例如透明的地区 . 我得到的Endresult是我主要看到最后一次渲染过程的效果,但是在边界上(alpha值稍微下降)我确实看到了第一个着色器效果 . 我的想法是,我应该使用第二个glBlendFunc,它允许混合两个通道,但我不能想到一种不触及任何alpha值的方法,这会破坏所希望的效果 .
我该怎么办?还有什么东西然后alphablending?
编辑:我的目标是组合一个或多个传球 . 我想混合颜色(最有可能将它们加在一起),我们通过不同层的以下混合函数计算每个路径中的颜色:glBlendFuncSeparate(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA,GL_ONE,GL_ONE_MINUS_SRC_ALPHA)
EDIT: 你好!我正在解决这个问题,但我遇到了困难 . 我不明白我如何在任何着色器中正确设置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);
2 回答
由于您的评论,您可以使用所需的混合函数将每个传递单独渲染到纹理中(最好使用FBOs) . 然后,您可以在一次传递中将不同的传递混合在一起,只需绘制一个屏幕大小的四边形,并在片段着色器中将所有传递的纹理平均在一起 .
EDIT: 根据你的评论 . 您可以将这些传递单独直接渲染到纹理(绑定为FBO附件)中 . 然后你使用像这样的片段着色器和一个屏幕大小的四边形,假设你有三个传递:
EDIT: 或者,您可以使用简单的1纹理片段着色器(仅从单个纹理中查找颜色并将其放出)并使用Tobias的混合配置绘制多个纹理四边形 . 如果通过次数不是先验的,则这也可以更好地扩展 .
我认为你不想使用纹理的alpha值作为混合因子,而是使用一个恒定因子来进行1:1混合 .
您必须在所有纹理图层上分布混合因子 . 因此,所有纹理上的白色像素将合计为1 .
3层将成为:
还要记住,alpha-blending是一种依赖于顺序的操作 .