OpenGL中Framebuffer和Renderbuffer的概念和区别是啥?
Posted
技术标签:
【中文标题】OpenGL中Framebuffer和Renderbuffer的概念和区别是啥?【英文标题】:What's the concept of and differences between Framebuffer and Renderbuffer in OpenGL?OpenGL中Framebuffer和Renderbuffer的概念和区别是什么? 【发布时间】:2011-01-13 20:34:21 【问题描述】:我对 Framebuffer 和 Renderbuffer 的概念感到困惑。我知道它们需要渲染,但我想在使用前了解它们。
我知道需要一些位图缓冲区来存储临时绘图结果。后台缓冲区。当这些绘图正在进行时,需要在屏幕上看到另一个缓冲区。前缓冲区。 翻转它们,然后再次绘制。我知道这个概念,但很难将这些对象与这个概念联系起来。
它们的概念和区别是什么?
【问题讨论】:
Renderbuffer 是 Framebuffer 的通道类组件(颜色、模板、深度等)。见:developer.apple.com/iphone/library/documentation/3DDrawing/… 该链接是特定于 iPhone 的,但对帧缓冲区进行了很好的解释。 【参考方案1】:Framebuffer 对象实际上并不是一个缓冲区,而是一个包含一个或多个附件的聚合器对象,而这些附件又是实际的缓冲区。您可以将 Framebuffer 理解为 C 结构,其中每个成员都是指向缓冲区的指针。在没有任何附件的情况下,Framebuffer 对象的占用空间非常小。
现在每个附加到 Framebuffer 的缓冲区都可以是 Renderbuffer 或 texture。
Renderbuffer 是一个实际的缓冲区(字节、整数或像素数组)。 Renderbuffer 以原生格式存储像素值,因此针对离屏渲染进行了优化。换句话说,绘制到 Renderbuffer 比绘制到纹理要快得多。缺点是像素使用原生的、依赖于实现的格式,因此从 Renderbuffer 读取比从纹理读取要困难得多。然而,一旦绘制了 Renderbuffer,就可以使用像素传输操作非常快速地将其内容直接复制到屏幕(或其他 Renderbuffer,我猜)。这意味着可以使用 Renderbuffer 来有效地实现您提到的双缓冲区模式。
Renderbuffers 是一个相对较新的概念。在他们之前,Framebuffer 用于渲染到 texture,由于纹理使用标准格式,这可能会更慢。仍然可以渲染到纹理,当需要对每个像素执行多次传递以构建场景或在另一个场景的表面上绘制场景时,这非常有用!
OpenGL wiki 有 this page 显示更多详细信息和链接。
【讨论】:
谢谢!将其解释为类似于结构和指针对我来说更有意义。 这对我来说仍然有点混乱。如果渲染缓冲区只允许快速复制到另一个渲染缓冲区,那么它几乎没有用!如果我必须做一个后处理阶段(如 SSAO),使用先前渲染到纹理将其渲染到默认帧缓冲区比将其渲染到 RenderBuffer 然后复制回屏幕更容易吗? 渲染缓冲区不是为自定义后期处理而设计的。它们可用于存储绘图过程的深度和模板信息。这是可能的,因为只有 GPL 实现本身需要读取渲染缓冲区数据,并且往往比纹理更快,因为使用的是原生格式。如果您需要后期处理,请使用纹理。【参考方案2】:This page 有一些我认为可以很好地解释差异的细节。首先:
OpenGL 管道的最终渲染目的地称为 [the] framebuffer。
鉴于:
渲染缓冲区对象 此外,还为离屏渲染新引入了 renderbuffer 对象。它允许将场景直接渲染到渲染缓冲区对象,而不是渲染到纹理对象。渲染缓冲区只是一个包含可渲染内部格式的单个图像的数据存储对象。用于存储没有对应纹理格式的OpenGL逻辑缓冲区,如模板或深度缓冲区。
【讨论】:
以上是关于OpenGL中Framebuffer和Renderbuffer的概念和区别是啥?的主要内容,如果未能解决你的问题,请参考以下文章
Linux OpenGL 实践篇-3 framebuffer
OpenGL FrameBuffer 和 glViewport