你如何启用垂直同步?
它简单glEnable(GL_VSYNC)
吗?(虽然在glEnable接受的选项中没有GL_VSYNC或类似的东西).
或者在opengl中没有标准的方法吗?
在Windows上有OpenGL扩展方法wglSwapIntervalEXT
.来自b2b3的帖子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
#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()
.