OpenGL Alpha混合问题,混合被忽略(可能)?
编辑+更好的解决方案: 如果有人碰巧遇到我遇到的问题,有两种解决方案。一个是被接受的解决方案,但这只适用于你像我那样做事的情况。让我解释一下我在做什么: 1.)将星星背景渲染到屏幕 2.)渲染船舶,然后将粒子渲染到FBO 3.)将FBO渲染到屏幕 这个问题,以及这个问题的解决方案,首先是因为我把FBO和恒星背景混合在一起 真正的解决方案(据说也稍微快一点)是简单地将恒星背景渲染到FBO,然后在禁用混合的情况下将FBO渲染到屏幕。使用此方法,我不需要处理glBlendFuncSeparate 1.)渲染恒星,然后运送,然后将粒子渲染到FBO 2.)在禁用混合的情况下将FBO渲染到屏幕 ----------原始问题:---------- 从我对这个问题的理解来看,混合在某种程度上被忽视了。具有alpha透明度的粒子纹理完全覆盖以下像素 我正在创建一个自上而下的游戏。相机略微倾斜,因此有一定的深度感。我正在渲染我的飞船,然后在上面撕裂粒子 在开始OpenGL上下文之后OpenGL Alpha混合问题,混合被忽略(可能)?,opengl,glsl,opengl-3,Opengl,Glsl,Opengl 3,编辑+更好的解决方案: 如果有人碰巧遇到我遇到的问题,有两种解决方案。一个是被接受的解决方案,但这只适用于你像我那样做事的情况。让我解释一下我在做什么: 1.)将星星背景渲染到屏幕 2.)渲染船舶,然后将粒子渲染到FBO 3.)将FBO渲染到屏幕 这个问题,以及这个问题的解决方案,首先是因为我把FBO和恒星背景混合在一起 真正的解决方案(据说也稍微快一点)是简单地将恒星背景渲染到FBO,然后在禁用混合的情况下将FBO渲染到屏幕。使用此方法,我不需要处理glBlendFuncSeparate 1.
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);
您还应确保:
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);