SFML 和 OpenGL 3.3:没有 GLUT 的双缓冲

SFML & OpenGL 3.3: double buffering without GLUT

我想用 SFML 和 OpenGL 3.3 编写跨平台 3D 应用程序(也许是游戏,谁知道呢),主要目的是学习 C++。

SFML 提供了很酷的事件模型,处理纹理、文本、输入等。我已经用立方体做了简单的演示(仍然是旧的 glBegin/glEnd 方式,但是当我找到一个附加 OpenGL 扩展的方法)。

我遇到的第一个问题是双缓冲。如您所知,执行渲染的通常(和逻辑)方式使用两个缓冲区,即显示缓冲区和渲染缓冲区。在渲染缓冲区上执行渲染循环,当它结束时,结果将处理到显示缓冲区(或者可能有两个相同的缓冲区只是每个循环切换角色,不知道)。这可以防止闪烁和伪影。

问题在于,在任何 OpenGL 示例中,我都看到作者使用了 GLUT 和类似 glutSwapBuffers 的函数。如果我理解正确的话,双缓冲是特定于平台的(这对我来说很奇怪,因为我认为它必须在 OpenGL 部分完成)并且像 GLUT 这样的东西只是隐藏了特定于平台的点。但我已经在使用 SFML 进行上下文和 OpenGL 初始化。

是否有任何跨平台的方式来处理与 SFML 配对的 OpenGL 双缓冲?我在这个项目中没有使用 SFML 图形,但目标是 RenderWindow。

SFML 可以处理双缓冲,但如果您不使用 SFML 图形库,则必须使用sf::Window实例。

通过调用 sf::Window::setActive 将 window 设置为 OpenGL 渲染目标,使用 OpenGL 函数绘制内容,然后调用 sf::Window::display 交换后台缓冲区来处理双缓冲。更多信息可以在 SFML API 中找到(链接版本是 v2.3.2)。