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

Eon*_*nil 126 opengl rendering framebuffer

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

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

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

fer*_*olo 178

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

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

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

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

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

  • 谢谢!将它解释为类似结构和指针对我来说更有意义. (13认同)
  • 渲染缓冲区不是为自定义后处理而设计的.它们可用于存储绘制过程的深度和模板信息.这是可能的,因为只有GPL实现本身需要读取renderbuffer数据,并且往往比纹理更快,因为使用本机格式.如果您需要后期处理,请使用纹理. (3认同)
  • 这对我来说仍然有点混乱.如果renderbuffer只允许快速复制到另一个渲染缓冲区,那么几乎没有用它!如果我必须进行后处理阶段(如SSAO),使用先前渲染到Textures的渲染默认帧缓冲区要比将其渲染到RenderBuffer然后复制回屏幕更容易吗? (2认同)

Chr*_*isF 58

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

OpenGL管道的最终渲染目标称为[ frame ] 缓冲区.

鉴于:

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