OpenGL中的帧缓冲区和渲染缓冲区的概念和区别是什么?


136

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

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

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


7
渲染缓冲区是帧缓冲区的类似于通道的组件(颜色,模板,深度等)。请参阅:developer.apple.com/iphone/library/documentation/3DDrawing/...
eonil

2
链接是特定于iPhone的,但帧缓冲区已得到很好的说明。
j00hi 2011年

Answers:


62

该页面包含一些细节,我认为可以很好地解释它们之间的区别。首先:

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

鉴于:

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


196

帧缓冲区对象并不是一个真正的缓冲区,但包含一个或多个附件,它通过轮到自己,是实际的缓冲区的聚合对象。您可以将Framebuffer理解为C结构,其中每个成员都是指向缓冲区的指针。没有任何附件,Framebuffer对象的占用空间非常小。

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

所述渲染是一个实际的缓冲液(字节,或整数,或像素的阵列)。该渲染原生格式存储的像素值,所以它的屏幕外渲染优化。换句话说,绘制到Renderbuffer比绘制到纹理要快得多。缺点是像素使用与实现有关的本机格式,因此从Renderbuffer读取要比从纹理读取难得多。但是,一旦绘制了Renderbuffer,就可以使用像素传输操作非常快速地将其内容直接复制到屏幕(或我想复制到其他Renderbuffer)中。这意味着渲染缓冲区 可用于有效地实现您提到的双缓冲区模式。

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

OpenGL Wiki的此页面显示更多详细信息和链接。


13
谢谢!对我来说,将其解释为类似结构和指针的含义更有意义。
DouglasHeriot

2
这仍然让我感到困惑。如果renderbuffer只允许快速复制到另一个渲染缓冲区,那么几乎没有用!如果我必须进行后处理阶段(如SSAO),使用先前渲染到Textures的渲染到默认帧缓冲区比将其渲染到RenderBuffer然后复制回屏幕难吗?
CoffeDeveloper

4
渲染缓冲区不适用于自定义后处理。它们可用于存储深度和模板信息以进行绘制过程。这是可能的,因为只有GPL实现本身需要读取渲染缓冲区数据,并且由于使用本机格式,因此往往比纹理更快。如果需要后期处理,请使用纹理。
fernacolo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.