如何在(视频)内存中创建缓冲区以使用OpenGL进行绘制?

时间:2013-02-06 20:29:11

标签: c++ opengl buffer sfml

OpenGL使用两个缓冲区,一个用于在屏幕上显示,另一个用于渲染。它们被交换以避免闪烁。 (双缓冲。)

是否可以在(我假设视频内存)中创建另一个“缓冲区”,以便可以在其他地方完成绘图。我问的原因是我有几个SFML Windows,我希望能够指示OpenGL为每个窗口绘制一个独立的缓冲区。目前我无法控制渲染缓冲区。编辑有一个:所有(不是每个)窗口。调用window.Display()后,此缓冲区的内容将复制到窗口内显示的另一个缓冲区。 (我认为这是如何运作的。)

3 个答案:

答案 0 :(得分:2)

您正在寻找的术语是“屏幕外渲染”。使用OpenGL有两种方法可以做到这一点。

一个是使用操作系统底层图形层提供的专用屏幕外可绘制。这称为PBuffer。 PBuffer可以像窗口一样使用,不会映射到屏幕。 PBuffers是第一个使用OpenGL实现离屏渲染的强大方法;它们是在1998年推出的。由于PBuffers是功能齐全的可绘制的,因此可以附加OpenGL上下文。

另一种方法是使用OpenGL本身提供的屏幕外渲染目标,而不是操作系统。这称为Framebuffer对象。 FBO需要一个功能齐全的OpenGL上下文才能工作。但FBO无法提供可绘制的OpenGL上下文需要附加,才能起作用。因此,FBO的主要用途是向它们渲染中间图片,稍后在屏幕上显示可见图片时使用。幸运的是,对于FBO来说,可以隐藏OpenGL上下文可绘制的可绘制内容。因此,您可以使用对用户隐藏的常规窗口。

如果您希望纯粹的屏幕外渲染,PBuffer仍然是一个非常可行的选择,特别是在GLX / X11(Linux)上,它们可以立即使用而无需修改扩展。

答案 1 :(得分:0)

答案 2 :(得分:-1)

如果您有第三个缓冲区,则会失去双缓冲的值。双缓冲区有效,因为您正在更改指向发送到显示设备的像素阵列的指针。如果包含第三个缓冲区,则必须将其复制到每个缓冲区中。

我有一段时间没有使用OpenGL,但它不能更好地渲染到纹理(位图)。这使得OpenGL的每个实现都可以选择将内存中的位图选择到屏幕的适当区域的视频缓冲区中。