【问题标题】:SFML & OpenGL 3.3: double buffering without GLUTSFML 和 OpenGL 3.3:没有 GLUT 的双缓冲
【发布时间】:2016-10-14 07:59:44
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 与问题没有直接关系,但你不需要"attach OpenGL extensions"来使用新的OpenGL(3及以上)。在 Windows 上,您需要 GLEW 或类似的库。
  • 不要因为没有得到答案就delete and re-ask a question。另外,如果“我在这个项目中没有使用 SFML 图形。”,你为什么要问 SFML 的解决方案?
  • @NicolBolas 这有点违反直觉,但 SFML 图形标头不是利用 SFML 的图形功能所必需的,除非您想使用 SFML 的高级(主要)无 OpenGL 函数。 Window 库可能就是 OP 使用的全部。
  • 2 @Nicol Bolas:问题没有答案并且完全改变了——感谢你们的 cmets,所以我创建了另一个问题。我的意思是我不需要 SFML 进行渲染,SFML 只提供上下文、事件等

标签: c++ opengl sfml doublebuffered


【解决方案1】:

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

双缓冲的处理方式是调用sf::Window::setActive将窗口设置为OpenGL渲染目标,使用OpenGL函数绘制内容,然后调用sf::Window::display交换后台缓冲区。更多信息可见SFML API(链接版本为v2.3.2)。

【讨论】:

  • 谢谢你的回答,我会检查的。我必须使用 RenderWindow 代替 Window 吗?
  • @ArmanHayots 我不这么认为。如果你只坚持使用 OpenGL 函数,那么你应该只需要 sf::Window,而不是 sf::RenderWindow。如果你想利用 SFML 的变换、颜色等,那么你需要一个sf::RenderWindow
  • 看起来我需要在问任何其他问题之前完全阅读 SFML API。再次感谢。
  • @ArmanHayots 总是一个好计划 - SFML 的 API 文档实际上做得非常好。祝你好运!
猜你喜欢
  • 1970-01-01
  • 2012-05-18
  • 1970-01-01
  • 1970-01-01
  • 2012-07-29
  • 2012-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多