当前位置:  开发笔记 > 开发工具 > 正文

如何在opengl中启用垂直同步?

如何解决《如何在opengl中启用垂直同步?》经验,为你挑选了1个好方法。

你如何启用垂直同步?

它简单glEnable(GL_VSYNC)吗?(虽然在glEnable接受的选项中没有GL_VSYNC或类似的东西).

或者在opengl中没有标准的方法吗?



1> eugensk..:

在Windows上有OpenGL扩展方法wglSwapIntervalEXT.来自b2b3的帖子http://www.gamedev.net/community/forums/topic.asp?topic_id=360862:

如果您在Windows上工作,则必须使用扩展来使用 wglSwapIntervalExt功能.它在wgle​​xt.h中定义.您还需要下载glext.h文件.在wgle​​xt文件中,声明了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().


我还使用了wglGetProcAddress而不是LogGetProcAddress
在你的第一个代码片段中,如果(strstr(_wglGetExtensionsString(),extension_name)== NULL)应该读取(strstr(_wglGetExtensionsStringEXT(),extension_name)== NULL) - 但是谢谢,这对我有帮助!
这不是OpenGL的扩展,而是WGL(OpenGL的Microsoft Windows窗口系统API)的扩展.缓冲区交换本质上是一种窗口系统特定操作.就GL来说,它只是绘制到前/后左/右缓冲区或一些任意FBO.窗口系统是唯一具有足够的底层主机系统知识的东西,用于将绘制缓冲区的呈现与某些事件同步(在这种情况下是监视器的垂直回扫).
推荐阅读
臭小子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有