我正在使用OpenGL制作2D游戏。我最近尝试实现Framebuffer对象,我在混合方面遇到了一些问题。
我正在创建一个FBO(使用GL_RGBA作为格式)。 当我渲染到FBO时,我首先将其清除为完全透明的黑色,然后禁用GL_BLEND。然后我绘制纹理,然后再次启用GL_BLEND。 当我绘制FBO纹理时,我分别使用GL_SRC_ALPHA和GL_ONE_MINUS_SRC_ALPHA作为源和目标像素作为混合函数。我将它渲染为纹理四边形。 这不能正常工作,因为白色像素看起来是透明的。我尝试过尝试不同的混合函数值,但我尝试的所有值都存在问题。我不完全理解混合是如何工作的,所以我很难绕过它。也许我在这里遗漏了一些明显的东西?
这是一张现在看起来如何的图片。按钮在突出显示时应该会闪烁,但周围的像素看起来是透明的:http://i.snag.gy/RnV4s.jpg
您还可以在图像中看到两个文本框。最上面的一个是正常绘制的,没有FBO。纹理也在没有FBO的情况下正常渲染,所以我知道问题出在我的framebuffer-code中。
我已将“RenderTarget”类粘贴到pastebin(我以前称之为rendertarget而不是FBO):http://pastebin.com/dBXgjrUX
这就是我使用它的方式:
RT->Begin();
// draw stuff
RT->End();
RT->Draw();
有人能帮助我吗?如果您需要有关我的问题的更多信息,请与我们联系。
编辑: 以下是我在启动时设置的OpenGL的属性:
// Initialize shaders
shaderManager.InitializeStockShaders();
// Set some OpenGL properties
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glShadeModel(GL_SMOOTH);
glAlphaFunc(GL_GREATER, 0.0f);
// Enables/disables
glEnable(GL_ALPHA_TEST);
glEnable(GL_BLEND);
glDisable(GL_DEPTH_TEST);
glDisable(GL_DITHER);
glDisable(GL_LIGHTING);
答案 0 :(得分:2)
我有点难以确定你的问题是什么,因为你没有提供源代码。唉,我看到几个潜在的麻烦制造者:
首先你告诉你要在按钮周围画一个光晕。我认为,所有按钮都被绘制到FBO中,将它们合并到UI覆盖中。 Glow听起来像是想要混合一些东西,所以你可能也希望启用混合,绘制到FBO。
接下来要注意深度缓冲问题。混合和深度缓冲具有特殊的相互作用。在您的情况下,我建议禁用深度测试和深度写入FBO(或根本不使用FBO的深度缓冲附件)。最后绘制发光按钮,这样就不会阻止其他按钮被绘制。此外,你必须确保你的光芒具有非零的alpha值,否则它会混合透明。这是您在着色器或纹理环境中控制的内容(取决于您使用的内容)。
你的FBO类没有正确地确保附加到绑定帧缓冲区的纹理不能自己绑定。通过将附件代码移动到绑定中,很容易修复,其中纹理也是未绑定的。请参阅我编辑过的pastebin http://pastebin.com/1uVT7VkR(我可能错过了一些内容)。