Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl glBlendFunc和alpha混合_Opengl_Alphablending_Glblendfunc - Fatal编程技术网

Opengl glBlendFunc和alpha混合

Opengl glBlendFunc和alpha混合,opengl,alphablending,glblendfunc,Opengl,Alphablending,Glblendfunc,我正在编写一个应用程序,允许用户在不同的着色器之间切换,以及它们的组合。因此,我想多次绘制完全相同的场景 最后,应将所有过程合并为一个输出。为了组合所有的过程,我考虑使用glblendfunc,但是我没有得到我想要的结果 glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); //use first shader draw(); if (secondShaderWished) { //use secon

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

最后,应将所有过程合并为一个输出。为了组合所有的过程,我考虑使用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值的方法,这会破坏预期效果

我该怎么办?还有别的事吗

编辑:我的目标是组合一个或多个传球。我想混合颜色(很可能是将它们加在一起),因为每个路径中的颜色都是通过以下跨不同层的混合函数计算的:glBlendFuncSeparate(GL_SRC_ALPHA,GL_ONE_减_SRC_ALPHA,GL_ONE,GL_ONE_减_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);

我认为您不希望使用纹理的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混合是一种顺序相关的操作。

根据您的注释,您可以使用所需的混合功能将每个过程单独渲染为纹理(最好使用)。然后,只需绘制一个屏幕大小的四边形并在片段着色器中将所有过程的纹理平均在一起,就可以在单个过程中将不同的过程混合在一起

根据您的评论编辑:。将这些过程分别直接渲染到纹理(绑定为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));
}

编辑:或者,您可以使用简单的单纹理片段着色器(仅从单个纹理中查找颜色并将其输出),并使用Tobias的混合配置绘制多个纹理四边形。如果事先不知道渲染过程的数量,这也可以更好地进行缩放。

那么,您希望结果只是两个渲染过程的平均值吗?请尝试计算出您希望发生的具体颜色数学,然后编辑您的帖子,将其包括在内。是的,我确实希望结果是两个渲染过程的平均值!在每个渲染过程中,我希望能够根据需要绘制尽可能多的层,直到用户对所得到的有信心为止。因此,我有多个层的多个过程。因此,我需要alpha值作为混合因子。至少在每一关!我刚刚在stackoverflow上创建了另一个问题,这个问题可能比再次编辑的问题更适合回答,这个问题与原始问题没有太多关系。。。。看我上面的评论,我确实需要alpha值作为混合因子。我现在要做的就是一直用同样的纹理画画。手边有多个纹理,每次使用一个纹理有什么用?大家好,我开始思考你的答案是什么意思,我想出了使用渲染缓冲层而不是纹理的想法。因此,这意味着我设置了一个新的framebufferobject,并为每个过程生成一个renderbuffer。我现在想做的是把这些渲染缓冲区画进去?这行得通吗?一旦我这样做了,我将如何平均所有渲染缓冲层/纹理?你有关于如何使用具有多个纹理输入的片段着色器的示例/教程吗?@Donny基本上是的,但不要将渲染缓冲区作为FBO附件,而是使用纹理,就像我说的那样。因此,您可以直接渲染到纹理中,而不需要从renderbuffer检索图像。然后,在最终过程的片段着色器中,只需使用多个
sampler2D
uniforms(纹理绑定到的,您刚刚写入的),通过相同的纹理坐标(可能是像素的屏幕坐标)访问它们,然后将这些值平均在一起以生成最终颜色。