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

时间:2010-02-06 12:14:16

标签: opengl rendering framebuffer

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

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

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

2 个答案:

答案 0 :(得分:171)

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

现在连接到 Framebuffer 的每个缓冲区可以是 Renderbuffer 纹理

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

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

OpenGL wiki有this page,显示更多详细信息和链接。

答案 1 :(得分:57)

This page有一些细节,我认为很好地解释了差异。首先:

  

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

鉴于:

  

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