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

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

我知道一些位图缓冲区是需要存储临时绘图结果。 后台缓冲区。 当这些图纸正在进行时,需要在屏幕上看到另一个缓冲区。 前台缓冲区。 把它们翻过来再画一遍。 我知道这个概念,但很难将这些对象连接到这个概念上。

他们的概念和差异是什么?

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

OpenGLpipe道的最终渲染目标被称为帧缓冲

鉴于:

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

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

现在,每个附加到Framebuffer的缓冲区都可以是Renderbuffer纹理

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

渲染缓冲区是一个相对较新的概念。 在它们之前,使用Framebuffer渲染纹理 ,由于纹理使用标准格式,纹理可能会变慢。 渲染到纹理仍然是可能的,当需要在每个像素上执行多个遍历来构build场景或者在另一个场景的表面上绘制场景时,这是非常有用的!

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