149

我对 Framebuffer 和 Renderbuffer 的概念感到困惑。我知道它们需要渲染,但我想在使用前了解它们。

我知道需要一些位图缓冲区来存储临时绘图结果。后台缓冲区。当这些绘图正在进行时,需要在屏幕上看到另一个缓冲区。前缓冲区。翻转它们,然后再次绘制。我知道这个概念,但很难将这些对象与这个概念联系起来。

它们的概念和区别是什么?

4

2 回答 2

219

Framebuffer对象实际上不是缓冲区,而是包含一个或多个附件的聚合器对象,而这些附件又是实际的缓冲区。您可以将Framebuffer理解为 C 结构,其中每个成员都是指向缓冲区的指针。如果没有任何附件,Framebuffer对象的占用空间非常低。

现在每个附加到Framebuffer的缓冲区都可以是Renderbuffertexture

Renderbuffer是一个实际的缓冲区(字节、整数或像素数组)。Renderbuffer以原生格式存储像素值,因此针对屏幕外渲染进行了优化。换句话说,绘制到渲染缓冲区比绘制到纹理要快得多。缺点是像素使用原生的、依赖于实现的格式,因此从渲染缓冲区读取比从纹理读取要困难得多。尽管如此,一旦绘制了Renderbuffer ,就可以使用像素传输操作将其内容直接复制到屏幕(或其他Renderbuffer,我猜)。这意味着一个渲染缓冲区可用于有效实现您提到的双缓冲区模式。

渲染缓冲区是一个相对较新的概念。在他们之前,帧缓冲区用于渲染到纹理,这可能会更慢,因为纹理使用标准格式。仍然可以渲染到纹理,当需要对每个像素执行多次传递以构建场景或在另一个场景的表面上绘制场景时,这非常有用!

OpenGL wiki 有这个页面显示更多细节和链接。

于 2012-11-18T18:29:15.433 回答
64

这个页面有一些我认为很好地解释了差异的细节。首先:

OpenGL 管道的最终渲染目的地称为 [the] framebuffer

然而:

Renderbuffer 对象
此外,新引入了renderbuffer 对象用于离屏渲染。它允许将场景直接渲染到渲染缓冲区对象,而不是渲染到纹理对象。渲染缓冲区只是一个包含可渲染内部格式的单个图像的数据存储对象。它用于存储没有对应纹理格式的OpenGL逻辑缓冲区,例如模板或深度缓冲区。

于 2010-02-06T12:33:20.643 回答