我的FBO中是否需要RenderBuffer对象来保留alpha通道的渲染到纹理?

时间:2014-09-06 04:45:42

标签: opengl

在Windows 7(带有nVidia GTS 450)上,我的帧缓冲似乎被锁定为0位。这意味着当我调用glCopyTexSubImage2D渲染到纹理时,纹理将始终是不透明的。

我正在编写一个替代版本的OpenGL代码,它将使用FBO渲染到纹理(而不是glCopyTexSubImage2D),希望能够解决alpha丢弃问题。< / p>

如果我使用FBO,我是否还需要分配自己的帧缓冲区(RenderBufferObject)?我对FBO的了解有点缺乏,但我的理解是,如果我不提供渲染缓冲存储,只是附加纹理,它将使用现有的帧缓冲区(没有alpha位),因此我的纹理仍然是完全不透明的。

编辑:我的项目设置有些麻烦是我的alpha位被锁定为0的原因,我现在已成功获得8位alpha glCopyTexSubImage2D

1 个答案:

答案 0 :(得分:0)

纹理和渲染缓冲区大多与FBO附件具有相同的用途。您可以使用纹理或渲染缓冲区作为颜色附件,纹理或渲染缓冲区作为深度附件等。

主要区别在于,在完成渲染到FBO之后,如果使用纹理作为附件,则可以像使用任何其他纹理一样使用它们进行采样。如果您使用了渲染缓冲区,则该选项不可用。除了充当FBO目标之外,渲染缓冲区不能用于任何其他目的。之后您可以使用glBlitFramebuffer()将其复制到另一个渲染目标。

因此,渲染缓冲区对于在完成FBO渲染后不再使用的缓冲区非常有用。通常,深度缓冲区也是如此。对于最有趣的3D渲染,您需要一个深度缓冲区来进行FBO渲染。但在许多情况下,一旦渲染完成,您将简单地丢弃深度缓冲区的内容。

如果你可以使用纹理附件做同样的事情,你可能会问为什么你会使用渲染缓冲区等等。可以有几个优点:

  • 在某些OpenGL版本中,Renderbuffers可以做的不仅仅是纹理附件。例如,ES 3.0支持多重采样渲染缓冲区,但不支持多重采样纹理。
  • 某些硬件体系结构具有多个内存布局,其中一个可能对渲染目标更有效,另一个更有效的采样。如果你分配了一个渲染缓冲区,那么驱动程序就会知道它只会被用作渲染目标,并且可能会为此目的使用更有效的内存布局。
  • 用于创建渲染缓冲区的API更简单。

这涵盖了一般背景。对于您的具体情况:

  • 不,如果渲染到纹理(即使用纹理作为FBO的颜色附件),则不需要渲染缓冲区用于相同的目的。
  • 您可能需要创建一个渲染缓冲区,以用作FBO渲染的深度缓冲区。要执行此操作,请使用glRenderbufferStorage()创建渲染缓冲区,并使用glFramebufferRenderbuffer()将其附加为FBO的GL_DEPTH_ATTACHMENT。请注意,默认帧缓冲区的深度缓冲区用于FBO渲染,因此如果需要深度缓冲区来进行FBO渲染,则需要这样做。
顺便说一句,你的视频卡肯定应该支持帧缓冲区中的alpha位。在Windows下,您可以通过设置cAlphaBits结构中的PIXELFORMATDESCRIPTOR字段来请求字母位。如果您想在帧缓冲区中使用alpha位,则此字段使用的典型值为8。