繁体   English   中英

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

[英]How can I create a buffer in (video) memory to draw to using OpenGL?

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

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

您要查找的术语是“屏幕外渲染”。 使用OpenGL可以使用两种方法。

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

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

如果您只希望在屏幕外进行渲染,那么PBuffer仍然是一个非常可行的选择,尤其是在GLX / X11(Linux)上,无需缓冲扩展即可立即使用它们。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM