OpenGL中的缓冲区是什么,如何利用多个缓冲区来提高性能?

8
不久前,我尝试了一本OpenGL指南中介绍的双缓冲程序,并在屏幕上显示了一个旋转的矩形。不幸的是,我现在没有这本书了,而且我也没有找到一个清晰明了的通用缓冲区定义。我的猜测是它是一个“地方”来绘制图形,使用很多可能像分层一样?
如果是这样,我想知道我能否利用多个缓冲区来优化多边形剪裁程序。我有一个好看的小窗口,允许用户在屏幕上画多边形,还有一个实用工具来拖动和画出选择框覆盖在多边形上。当用户画完选择矩形并放开鼠标时,多边形将根据矩形边界进行剪辑。
这个做法足够简单,但是我还希望用户可以重新开始:按下逃脱键时,剪辑框应该消失,原始多边形应该恢复。由于我是逐像素处理的,似乎很难弄清楚如何将矩形像素颜色改回黑色或特定多边形的颜色,取决于它们被绘制的位置(除非我找到一种方法来保存每个多边形像素被绘制时的颜色,但这似乎太过复杂)。我想知道给矩形一个自己的缓冲区是否有帮助,希望它能像一种透明层一样,可以轻松清除(?)这是缓冲区可以使用的方式,还是我需要找到另一种解决方案?
1个回答

11

OpenGL支持多种类型的缓冲区:

  • 帧缓冲区(Framebuffers):用于存储绘图操作并更改缓冲区中的像素值。OpenGL默认具有屏幕缓冲区,可以分为前缓冲区和后缓冲区,在后缓冲区进行不可见的绘图操作,完成后将其交换到前缓冲区中。除此之外,OpenGL还使用深度缓冲区进行深度测试和Z排序,并使用模板缓冲区限制渲染范围,以剪贴选定部分的方式实现。过去还有辅助缓冲区和累积缓冲区,但这些已被所谓的帧缓冲对象(Framebuffer Objects)替代,帧缓冲对象是用户创建的对象,将多个纹理或渲染缓冲区组合成新的帧缓冲区,可以对其进行渲染。

  • 渲染缓冲区(Renderbuffers):由用户创建的渲染目标,附加到帧缓冲对象。

  • 缓冲区对象(Vertex and Pixel Buffer Objects):用户定义的数据存储,用于几何和图像数据。

  • 纹理(Texture):纹理类似于缓冲区,即它们保存数据,可以在绘图操作中作为来源。

OpenGL通常的做法是每当有变化时重新渲染整个场景。如果您想保存这些绘图操作,可以将帧缓冲区的内容复制到纹理中,然后只需将该纹理绘制到一个四边形中,并使用选择橡皮筋矩形进行覆盖。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接