纹理和renderbuffers主要服务于同一目的的原因作为FBO附件。您可以使用纹理或渲染缓冲区作为您的颜色附件,纹理或渲染缓冲区作为深度附件等。
主要区别在于,在完成对FBO的渲染后,如果您使用纹理作为附件,可以像任何其他纹理一样使用它们进行采样。如果您使用渲染缓冲区,则该选项不可用。渲染缓冲区不能用于除FBO目标外的其他任何事情。之后你可以用它做的唯一事情就是使用glBlitFramebuffer()
将它复制到另一个渲染目标。
因此,渲染缓冲区对于在完成FBO渲染后不再使用的缓冲区而言非常有用。对于深度缓冲区来说,情况通常如此。对于大多数有趣的3D渲染,您将需要FBO渲染的深度缓冲区。但在很多情况下,渲染完成后,您只需放弃深度缓冲区的内容。
你可能会问为什么你会使用渲染缓冲区,如果你可以用纹理附件等做同样的事情。可以有几个优点:
- 在某些OpenGL版本中,渲染缓冲区可以做的比纹理附件更多。例如,ES 3.0支持多重采样的渲染缓冲区,但不支持多重采样的纹理。
- 某些硬件架构具有多个内存布局,其中一个对渲染目标可能更高效,另一个对采样更有效。如果你分配一个渲染缓冲区,驱动程序知道它只会被用作渲染目标,并且可能会使用更高效的内存布局。
- 用于创建渲染缓冲区的API更简单。
这涵盖了一般背景。你的具体情况如下:
- 不,如果你渲染到一个纹理(即使用纹理作为你的FBO的颜色附件),你也不需要渲染缓冲区来达到同样的目的。
- 您可能需要创建一个渲染缓冲区,以用作FBO渲染的深度缓冲区。为此,您创建一个带有
glRenderbufferStorage()
的渲染缓冲区,并使用glFramebufferRenderbuffer()
将其作为FBO的GL_DEPTH_ATTACHMENT
进行附加。请注意,默认帧缓冲区的深度缓冲区是用于FBO渲染的而不是,所以如果您需要FBO渲染的深度缓冲区,则需要此深度缓冲区。
顺便说一句,你的视频卡应该肯定支持framebuffer中的阿尔法位。在Windows下,您可以通过在PIXELFORMATDESCRIPTOR
结构中设置cAlphaBits
字段来请求字母位。如果您想在帧缓冲区中使用字节位,则此字段的典型值为8。
[cAlphaBits在Windows上被忽略](http://msdn.microsoft.com/en-us/library/windows/desktop/dd368826%28v=vs.85%29.aspx)。即使设置了(到8),“glGetIntegerv”也会告诉我,我的帧缓冲区仍然没有字母位。质地仍然不透明。 – 2014-09-06 07:12:06
@ Mr.Smith:这是不正确的:“如上文所述,请仔细注意当前通用实现中不支持某些像素格式属性,通用实现是OpenGL的Microsoft GDI软件实现。部分是OpenGL的,并且可能支持一些不受通用实现支持的像素格式属性。“每个实现都包含微软的GDI渲染器,它支持从Windows开始的alpha通道。 – derhass 2014-09-06 12:21:18
我很确定我至少在Windows XP和NV34 GPU上使用了带有alpha位的帧缓冲区。我刚刚证实,他们仍然支持我当前运行Windows 8.1的笔记本电脑。在我测试的配置(英特尔高清4600显卡)中,我得到了一个像素格式,其中cAlphaBits = 8时甚至不需要alpha位。 – 2014-09-06 17:52:24