【发布时间】:2012-06-18 12:54:21
【问题描述】:
我正在使用 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);
【问题讨论】:
-
如果您改为透明黑色,黑色像素会消失而不是白色像素吗?我想知道渲染到 FBO 的驱动程序是否正在优化对已经是白色的像素的写入。
-
哎呀!我实际上清除到透明黑色(0.0、0.0、0.0、0.0)。对于那个很抱歉。我已经编辑了这个问题。我尝试清除为白色,但结果相同。
标签: c++ opengl 2d alphablending fbo