我正在编写一个应用程序,允许用户在不同的着色器和它们的组合之间切换。因此,我想要画一个完全相同的场景多次。
最后,所有的通行证应该合并成一个单一的输出。把所有的传球结合起来,我想使用glblendfunc,但我没有得到我想要的结果。
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
//use first shader
draw();
if (secondShaderWished) {
//use second shader
draw()
}在每次抽签调用中,我都会绘制一个具有alpha值的纹理,例如透明区域。我得到的最终结果是,我主要看到了最后一次渲染传递的效果,但是在边界上(α值略有下降),我确实看到了第一个着色效果。我确实认为我应该使用第二个glBlendFunc,它允许将两次传递混合在一起,但是我想不出一种不触及任何alpha值的方法,这会破坏愿望的效果。
我该怎么办?还有什么别的东西然后字母混合吗?
编辑:我的目标是合并一个或多个传球。我想混合颜色(很可能是将它们加在一起),因为每个路径中的颜色是通过跨不同层的以下混合函数计算的: 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);发布于 2011-09-07 10:46:28
由于您的评论,您可以使用您所需的混合功能,将每一次传递单独呈现到纹理中(最好使用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-06 20:38:42
我认为你不想使用α值的纹理作为一个混合因素,而是一个恒定的因素,给你一个1:1的混合。
你必须在所有纹理层上分配混合因素。因此,所有纹理上的一个白色像素加起来正好等于1。
float factor = 1.0f / numTextures;
glBlendColor(factor, factor, factor, factor);
glBlendFunc(GL_CONSTANT_COLOR, GL_ONE);对于三层将成为:
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)还请记住,α混合是一个顺序相关的操作。
https://stackoverflow.com/questions/7323229
复制相似问题