我正在使用 OpenGL 制作 2D 游戏。我最近尝试实现帧缓冲区对象,但在混合方面遇到了一些问题。
我正在创建一个 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 的情况下正常渲染,所以我知道问题出在我的帧缓冲区代码中。
我已将我的“RenderTarget”类粘贴到 pastebin(我习惯将其称为渲染目标而不是 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);