2010-02-06 78 views
101

我对Framebuffer和Renderbuffer的概念感到困惑。我知道他们需要渲染,但我想在使用前理解它们。OpenGL中Framebuffer和Renderbuffer的概念和区别是什么?

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

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

+5

Renderbuffer是Framebuffer的通道组件(颜色,模板,深度等)。请参阅:http://developer.apple.com/iphone/library/documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/OpenGLESonthe iPhone/OpenGLESonthe iPhone.html – Eonil 2010-09-05 10:28:38

+0

该链接是iPhone特定的,但帧缓冲区很好解释。 – j00hi 2011-03-17 15:08:01

回答

51

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

OpenGL流水线的最终渲染目的地被称为[the] framebuffer

鉴于:

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

+0

完美。谢谢! – Eonil 2010-02-06 12:45:23

144

帧缓冲区对象是不实际的缓冲器,但包含一个或多个附件,其通过轮到他们,是实际的缓冲器的聚合对象。您可以将Framebuffer理解为C结构,其中每个成员都是指向缓冲区的指针。没有任何附件,Framebuffer对象的占位面积非常小。

现在连接到帧缓冲区每个缓冲器可以是一个渲染纹理

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

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

该OpenGL维客有this page,显示更多的细节和链接。

+9

谢谢!把它解释成像结构和指针一样对我来说更有意义。 – DouglasHeriot 2013-05-17 13:44:46

+2

这对我来说仍然有点困惑。如果渲染缓冲区只允许快速复制到另一个渲染缓冲区,那么几乎没有用处!如果我必须做一个后期处理阶段(如SSAO),使用之前呈现给纹理的渲染到RenderBuffer然后复制回屏幕不是更容易将其渲染为默认帧缓冲区? – GameDeveloper 2015-01-12 10:29:43

+3

渲染缓冲区不适用于自定义后期处理。它们可用于存储绘图程序的深度和模板信息。这是可能的,因为只有GPL实现本身需要读取渲染缓冲区数据,并且往往比纹理更快,因为它使用本机格式。 如果您需要后处理,请使用纹理。 – fernacolo 2015-01-12 23:20:59