如何启用垂直同步?
是不是很简单,比如glEnable(GL_VSYNC)
? (尽管 glEnable 接受的选项中没有 GL_VSYNC 或类似的东西)。
或者在opengl中没有标准的方法来做到这一点?
在Windows上有OpenGL扩展方法wglSwapIntervalEXT
。
摘自 b2b3 的帖子http://www.gamedev.net/community/forums/topic.asp?topic_id=360862 http://www.gamedev.net/community/forums/topic.asp?topic_id=360862:
如果您在 Windows 上工作,则必须使用扩展才能使用wglSwapIntervalExt
功能。这是
在 wglext.h 中定义。您还会想要
下载 glext.h 文件。
在 wglext 文件中,Windows 特定扩展的所有入口点都是
宣布。所有此类功能启动
带前缀 wgl。
要获取有关所有已发布扩展的更多信息,您可以查看
OpenGL 扩展注册表。
wglSwapIntervalEXT
来自WGL_EXT_swap_control
扩大。它
让您指定最小数量
每次缓冲区交换之前的帧。
通常用于垂直
同步(如果您设置交换
间隔至 1)。有关整体的更多信息
扩展可以在这里找到。
使用此功能前需要查询您的卡是否有
支持WGL_EXT_swap_control
和
然后获取函数指针
使用wglGetProcAddress
功能。
要测试对给定扩展的支持,您可以使用如下函数:
#include <windows.h>
#include "wglext.h"
bool WGLExtensionSupported(const char *extension_name)
{
// this is pointer to function which returns pointer to string with list of all wgl extensions
PFNWGLGETEXTENSIONSSTRINGEXTPROC _wglGetExtensionsStringEXT = NULL;
// determine pointer to wglGetExtensionsStringEXT function
_wglGetExtensionsStringEXT = (PFNWGLGETEXTENSIONSSTRINGEXTPROC) wglGetProcAddress("wglGetExtensionsStringEXT");
if (strstr(_wglGetExtensionsStringEXT(), extension_name) == NULL)
{
// string was not found
return false;
}
// extension is supported
return true;
}
要初始化函数指针,您需要:
PFNWGLSWAPINTERVALEXTPROC wglSwapIntervalEXT = NULL;
PFNWGLGETSWAPINTERVALEXTPROC wglGetSwapIntervalEXT = NULL;
if (WGLExtensionSupported("WGL_EXT_swap_control"))
{
// Extension is supported, init pointers.
wglSwapIntervalEXT = (PFNWGLSWAPINTERVALEXTPROC) wglGetProcAddress("wglSwapIntervalEXT");
// this is another function from WGL_EXT_swap_control extension
wglGetSwapIntervalEXT = (PFNWGLGETSWAPINTERVALEXTPROC) wglGetProcAddress("wglGetSwapIntervalEXT");
}
然后您可以将这些指针用作任何其他函数指针。要启用 vync,您可以调用wglSwapIntervalEXT(1)
,要禁用它,你可以调用wglSwapIntervalEXT(0)
.
要获取当前交换间隔,您需要调用wglGetSwapIntervalEXT()
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)