0

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

是否可以在(我假设是视频内存)中创建另一个“缓冲区”,以便可以在其他地方进行绘图。我问的原因是我有几个 SFML Windows,我希望能够指示 OpenGL 为每个窗口绘制一个独立的缓冲区。目前我无法控制渲染缓冲区。有一个用于编辑:所有(不是每个)窗口。一旦你调用 window.Display(),这个缓冲区的内容就会被复制到另一个出现在窗口中的缓冲区。(我认为这就是它的工作原理。)

4

3 回答 3

3

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

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

另一种方法是使用 OpenGL 本身而不是操作系统提供的离屏渲染目标。这称为帧缓冲区对象。FBO 需要功能齐全的 OpenGL 上下文才能工作。但是 FBO 无法提供需要附加到 OpenGL 上下文才能正常工作的可绘制对象。所以 FBO 的主要用途是为它们渲染中间图片,稍后在屏幕上渲染可见图片时使用。幸运的是 FBO 可以工作,OpenGL 上下文绑定的可绘制对象可能会被隐藏。因此,您可以使用对用户隐藏的常规窗口。

如果您的愿望是纯粹的离屏渲染,那么 PBuffer 仍然是一个非常可行的选择,尤其是在 GLX/X11 (Linux) 上,它们可以立即可用,而无需修改扩展。

于 2013-02-06T22:40:10.090 回答
0

查看帧缓冲区对象 (FBO)

于 2013-02-06T20:30:43.903 回答
-1

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

我已经有一段时间没有使用 OpenGL 了,但是渲染成纹理(位图)会不会更好。这让 OpenGL 的每个实现都可以选择如何将位图从内存中获取到屏幕适当区域的视频缓冲区中。

于 2013-02-06T20:36:20.887 回答