首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >glBlendFunc与α共混

glBlendFunc与α共混
EN

Stack Overflow用户
提问于 2011-09-06 16:35:33
回答 2查看 9.9K关注 0票数 0

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

最后,所有的通行证应该合并成一个单一的输出。把所有的传球结合起来,我想使用glblendfunc,但我没有得到我想要的结果。

代码语言:javascript
复制
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在任何着色器..。我做错了什么?

代码语言:javascript
复制
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);
EN

回答 2

Stack Overflow用户

发布于 2011-09-07 10:46:28

由于您的评论,您可以使用您所需的混合功能,将每一次传递单独呈现到纹理中(最好使用FBO)。然后,您可以通过绘制一个屏幕大小的四角体,并在片段着色器中将所有传球的纹理平均在一起,将不同的传球组合在一起。

编辑:根据您的评论。您可以单独地将这些传递呈现到纹理(绑定为FBO附件)中。然后,假设您有三张通行证,就会使用像这样的带有屏幕大小的四边形的片段着色器:

代码语言:javascript
复制
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的混合配置绘制多个纹理四边形。如果事先不知道通行证的数量,这也可能会更好。

票数 1
EN

Stack Overflow用户

发布于 2011-09-06 20:38:42

我认为你不想使用α值的纹理作为一个混合因素,而是一个恒定的因素,给你一个1:1的混合。

你必须在所有纹理层上分配混合因素。因此,所有纹理上的一个白色像素加起来正好等于1。

代码语言:javascript
复制
float factor = 1.0f / numTextures;
glBlendColor(factor, factor, factor, factor);
glBlendFunc(GL_CONSTANT_COLOR, GL_ONE);

对于三层将成为:

代码语言:javascript
复制
             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)

还请记住,α混合是一个顺序相关的操作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7323229

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档