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

标签 c++ opengl buffer sfml

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

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

最佳答案

您要查找的术语是“离屏渲染”。使用 OpenGL 有两种方法可以做到这一点。

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

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

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

关于c++ - 如何在(视频)内存中创建缓冲区以使用 OpenGL 进行绘制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14738181/

相关文章:

c - 关于缓冲区溢出的练习

C 缓冲区溢出测试 - 64 位上不应该出现段错误?

c++ - 使用命名空间中的模板调用模板模板方法时出现 False clang 错误

c++ - 跨平台硬件原生 OpenGL 库,可能带有多媒体?

c++ - 搜索字符串 C++ 的结构 vector

c++ - QGLShaderProgram OpenGL 着色器

c++ - 可以在不附加到帧缓冲区的情况下复制渲染缓冲区吗?

javascript - Node.js 中 ReadSync 调用期间长度超出缓冲区错误

C++ va_list 返回奇数

c++ - 在循环中使用 isstringstream 作为分词器