如何在opengl中启用垂直同步?
如何启用垂直同步?
它是像 glEnable(GL_VSYNC)
这样简单的东西吗? (尽管 glEnable 接受的选项中没有 GL_VSYNC 或类似的东西)。
或者在opengl中没有标准的方法来做到这一点?
How do you enable vertical sync?
Is it something simple like glEnable(GL_VSYNC)
? (though there's no such thing as GL_VSYNC or anything like it in the options that glEnable accepts).
or is there no standard way to do this in opengl?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
在 Windows 上有 OpenGL 扩展方法
wglSwapIntervalEXT
。来自 b2b3 http://www.gamedev.net/community/ 的帖子论坛/topic.asp?topic_id=360862:
On Windows there is OpenGL extension method
wglSwapIntervalEXT
.From the post by b2b3 http://www.gamedev.net/community/forums/topic.asp?topic_id=360862:
WGL 案例在 eugensk00 的回答中进行了描述。
对于 CGL (MacOSX),请参阅另一个 SO 问题的此答案。
对于EGL,有eglSwapInterval() 功能,但显然(参见这个 和 这个)它不能保证无撕裂结果 - 只等待给定的时间(也许是只是由于驱动程序损坏)。
对于GLX(带有 X11 的 Linux 等),至少有 3 个类似的扩展,具有不同程度的功能。 OpenGL wiki 目前只列出了一种,Mesa <= 10.5.9(可能更高)不支持它。 以下是功能最齐全的扩展(在 OpenGL wiki 中列出)到最少的列表:
GLX_EXT_swap_control
设置每个可绘制每个显示器的交换间隔:
glXSwapIntervalEXT(dpy,drawable,interval)
获取当前交换间隔:
glXQueryDrawable(dpy, drawable, GLX_SWAP_INTERVAL_EXT, &interval)
获取最大交换间隔:
glXQueryDrawable(dpy, drawable, GLX_MAX_SWAP_INTERVAL_EXT, &maxInterval)
禁用垂直同步:将
间隔
设置为 0GLX_MESA_swap_control
设置每个上下文的交换间隔:
glXSwapIntervalMESA(interval)
获取当前交换间隔:
glXGetSwapIntervalMESA()
获取最大交换间隔:不支持
禁用垂直同步:将
间隔
设置为 0GLX_SGI_swap_control
设置交换间隔:
glXSwapIntervalSGI(interval)
。获取当前交换间隔:不支持
获取最大交换间隔:不支持
禁用垂直同步:不支持(
interval==0
是一个错误)有关自适应垂直同步,请参阅OpenGL 维基。
WGL case is described in the answer by eugensk00.
For CGL (MacOSX) see this answer to another SO question.
For EGL there's eglSwapInterval() function, but apparently (see this and this) it doesn't guarantee tearing-free result — only waits given period (maybe it's just due to broken drivers).
For GLX (Linux with X11 etc.) there are at least 3 similar extensions for this, with varying degree of functionality. OpenGL wiki currently lists only one, which is unsupported by Mesa <= 10.5.9 (and maybe higher). Here's a list from most feature-complete extension (listed in OpenGL wiki) to the least:
GLX_EXT_swap_control
Set swap interval per-drawable per-display:
glXSwapIntervalEXT(dpy, drawable, interval)
Get current swap interval:
glXQueryDrawable(dpy, drawable, GLX_SWAP_INTERVAL_EXT, &interval)
Get maximum swap interval:
glXQueryDrawable(dpy, drawable, GLX_MAX_SWAP_INTERVAL_EXT, &maxInterval)
Disable Vsync: set
interval
to 0GLX_MESA_swap_control
Set swap interval per-context:
glXSwapIntervalMESA(interval)
Get current swap interval:
glXGetSwapIntervalMESA()
Get maximum swap interval: unsupported
Disable Vsync: set
interval
to 0GLX_SGI_swap_control
Set swap interval:
glXSwapIntervalSGI(interval)
.Get current swap interval: unsupported
Get maximum swap interval: unsupported
Disable Vsync: unsupported (
interval==0
is an error)For adaptive Vsync see OpenGL wiki.
https://www.khronos.org/opengl/wiki/Swap_Interval
或者:(wgl 函数 typedef 位于 <代码>#include)
https://www.khronos.org/opengl/wiki/Swap_Interval
Alternatively: (wgl function typedefs are in
#include <GL/wglext.h>
)对于 eugensk 的回答中描述的 WGL 情况。
如果您遇到 nullptr 错误,请确保您正在 OpenGL 上下文中运行 {
wglGetProcAddress
} 部分代码。即在代码 {
glfwMakeContextCurrent(window);
} 之后。请参阅此处的答案。
For WGL case described in the answer by eugensk.
If you run into a nullptr error, make sure you are running {
wglGetProcAddress
} part code in an OpenGL Context.i.e. after codes {
glfwMakeContextCurrent(window);
}.See answer here.