SFML和OpenGL 3.3:无GLUT的双缓冲

SFML & OpenGL 3.3: double buffering without GLUT

本文关键字:缓冲 GLUT OpenGL SFML      更新时间:2023-10-16

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

SFML提供了很酷的事件模型,处理纹理、文本、输入等。我已经用cube做了简单的演示(仍然是旧的glBegin/glEnd方式,但我会在找到连接OpenGL扩展的方法时修复它)。

我遇到的第一个问题是双重抛光。您必须知道,执行渲染的常用(和逻辑)方法使用两个缓冲区,显示缓冲区和渲染缓冲区。在渲染缓冲区上执行渲染周期,当它结束时,结果将覆盖到显示缓冲区(或者可能每个周期有两个相同的缓冲区只是切换角色,不知道)。这可以防止闪烁和伪影。

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

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

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

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