Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.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 Alpha混合问题,混合被忽略(可能)?_Opengl_Glsl_Opengl 3 - Fatal编程技术网

OpenGL Alpha混合问题,混合被忽略(可能)?

OpenGL Alpha混合问题,混合被忽略(可能)?,opengl,glsl,opengl-3,Opengl,Glsl,Opengl 3,编辑+更好的解决方案: 如果有人碰巧遇到我遇到的问题,有两种解决方案。一个是被接受的解决方案,但这只适用于你像我那样做事的情况。让我解释一下我在做什么: 1.)将星星背景渲染到屏幕 2.)渲染船舶,然后将粒子渲染到FBO 3.)将FBO渲染到屏幕 这个问题,以及这个问题的解决方案,首先是因为我把FBO和恒星背景混合在一起 真正的解决方案(据说也稍微快一点)是简单地将恒星背景渲染到FBO,然后在禁用混合的情况下将FBO渲染到屏幕。使用此方法,我不需要处理glBlendFuncSeparate 1.

编辑+更好的解决方案:

如果有人碰巧遇到我遇到的问题,有两种解决方案。一个是被接受的解决方案,但这只适用于你像我那样做事的情况。让我解释一下我在做什么:

1.)将星星背景渲染到屏幕

2.)渲染船舶,然后将粒子渲染到FBO

3.)将FBO渲染到屏幕

这个问题,以及这个问题的解决方案,首先是因为我把FBO和恒星背景混合在一起

真正的解决方案(据说也稍微快一点)是简单地将恒星背景渲染到FBO,然后在禁用混合的情况下将FBO渲染到屏幕。使用此方法,我不需要处理glBlendFuncSeparate

1.)渲染恒星,然后运送,然后将粒子渲染到FBO

2.)在禁用混合的情况下将FBO渲染到屏幕

----------原始问题:----------

从我对这个问题的理解来看,混合在某种程度上被忽视了。具有alpha透明度的粒子纹理完全覆盖以下像素

我正在创建一个自上而下的游戏。相机略微倾斜,因此有一定的深度感。我正在渲染我的飞船,然后在上面撕裂粒子

在开始OpenGL上下文之后

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
glCullFace(GL_BACK);
在渲染循环中,我执行以下操作:

glBindFramebuffer(GL_FRAMEBUFFER,ook->fbo);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);

entitymgr_render(ook); //Render entities. Always 1.0 alpha textures.

glDisable(GL_DEPTH_TEST);
glDisable(GL_CULL_FACE);

//glBlendFunc(GL_SRC_ALPHA,GL_ONE); //This would enable additive blending for non-premult
particlemgr_render(ook); //Render particles. Likely always <1.0 alpha textures
//glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);

glBindFramebuffer(GL_FRAMEBUFFER,0);

让我知道我能提供什么。

我的猜测是FBO的rgb通道渲染正确,但因为它也有一个alpha通道,并且它是在启用混合的情况下绘制的,所以最终结果在粒子与宇宙飞船重叠的地方具有不正确的透明度

绘制粒子时,可以使用
glBlendFuncSeparate
()为alpha通道使用不同的混合因子:

glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE);

或者在将FBO绘制到屏幕上时完全关闭混合。

以获得纹理透明度,而不是:

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
您还应确保:

  • 使用glTexImage2D创建粒子tex时,使用格式为GL_RGBA(如果使用灰色着色纹理,则使用格式为GL_亮度_ALPHA)

  • 绘制粒子纹理时,在glBindTexture命令之后,调用

    glTexEnvi(GL_纹理_环境,GL_纹理_环境模式,GL_混合)

  • 您可以使用中所述的正确纹理函数,而不是GL_混合
    glTexEnv引用:

    在我看来,它似乎也在将alpha通道渲染到帧缓冲区中,因此当您写入粒子时,src alpha通道与目标alpha通道混合,这不是您想要的

    这正是创建glblendfuncseparate()函数的原因。试试这个

    glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE);
    

    因此,粒子的alpha通道将用于确定最终像素的颜色,但源和目标的alpha通道将一起添加。

    不正确。我特别为我的问题添加了
    opengl-3
    。这个函数适用于低于3.LOL的版本。我正在大量使用OpenGL SC,所以我对这个版本非常了解。我的错是没有注意到opengl-3标签。我接受了另一个答案,这个答案在这个答案之后发布,因为他/她更好地描述了问题以及GlblendFunc在这里做什么。这仍然是正确的答案。
    glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE);