在 OpenGL 中 Framebuffer 和 Renderbuffer 的概念和区别是什么?

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

我知道存储临时绘图结果需要一些位图缓冲区。后面的缓冲区。另一个缓冲区是需要在屏幕上看到的,当这些图纸是在进行中。前面的缓冲区。 我知道这个概念,但是很难把这些物体和这个概念联系起来。

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

46840 次浏览

本页 有一些细节,我认为可以很好地解释这种差异。首先:

OpenGL 管道的最终呈现目的地称为[ The ] Framebuffer

然而:

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

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

现在每个连接到 Framebuffer的缓冲区可以是 渲染缓冲质地

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

渲染缓冲区 是一个相对较新的概念。在此之前,使用 Framebuffer渲染到 质地,由于纹理使用标准格式,所以渲染速度可能较慢。它仍然可以渲染成纹理,当需要在每个像素上进行多次传递来构建场景,或者在另一个场景的表面上绘制场景时,这非常有用!

OpenGL wiki 有显示更多细节和链接的 这一页