在Windows 7(带有nVidia GTS 450)上,我的帧缓冲似乎被锁定为0位。这意味着当我调用glCopyTexSubImage2D
渲染到纹理时,纹理将始终是不透明的。
我正在编写一个替代版本的OpenGL代码,它将使用FBO渲染到纹理(而不是glCopyTexSubImage2D
),希望能够解决alpha丢弃问题。< / p>
如果我使用FBO,我是否还需要分配自己的帧缓冲区(RenderBufferObject)?我对FBO的了解有点缺乏,但我的理解是,如果我不提供渲染缓冲存储,只是附加纹理,它将使用现有的帧缓冲区(没有alpha位),因此我的纹理仍然是完全不透明的。
编辑:我的项目设置有些麻烦是我的alpha位被锁定为0的原因,我现在已成功获得8位alpha glCopyTexSubImage2D
答案 0 :(得分:0)
纹理和渲染缓冲区大多与FBO附件具有相同的用途。您可以使用纹理或渲染缓冲区作为颜色附件,纹理或渲染缓冲区作为深度附件等。
主要区别在于,在完成渲染到FBO之后,如果使用纹理作为附件,则可以像使用任何其他纹理一样使用它们进行采样。如果您使用了渲染缓冲区,则该选项不可用。除了充当FBO目标之外,渲染缓冲区不能用于任何其他目的。之后您可以使用glBlitFramebuffer()
将其复制到另一个渲染目标。
因此,渲染缓冲区对于在完成FBO渲染后不再使用的缓冲区非常有用。通常,深度缓冲区也是如此。对于最有趣的3D渲染,您需要一个深度缓冲区来进行FBO渲染。但在许多情况下,一旦渲染完成,您将简单地丢弃深度缓冲区的内容。
如果你可以使用纹理附件做同样的事情,你可能会问为什么你会使用渲染缓冲区等等。可以有几个优点:
这涵盖了一般背景。对于您的具体情况:
glRenderbufferStorage()
创建渲染缓冲区,并使用glFramebufferRenderbuffer()
将其附加为FBO的GL_DEPTH_ATTACHMENT
。请注意,默认帧缓冲区的深度缓冲区不用于FBO渲染,因此如果需要深度缓冲区来进行FBO渲染,则需要这样做。cAlphaBits
结构中的PIXELFORMATDESCRIPTOR
字段来请求字母位。如果您想在帧缓冲区中使用alpha位,则此字段使用的典型值为8。