nvidia opengl帧缓冲区对象强制vsync打开

nvidia opengl帧缓冲区对象强制vsync打开,c,opengl,nvidia,framebuffer,quake,C,Opengl,Nvidia,Framebuffer,Quake,基本上,我在基于q3的游戏中实现了gamma校正,以消除恼人的问题 我使用GL_EXT_framebuffer_对象作为后期处理顶点着色器。 除了在nvidia GPU上有一些奇怪的行为外,它工作得非常好: 它强制启用vsync,除非在控制面板中显式禁用它如果我使用标准控制面板的设置并启用了帧缓冲区,则强制执行vsync,但如果我删除帧缓冲区,它将恢复正常行为。 wglSwapIntervalEXT不执行任何操作 我在nvidia移动GPU上测试了它,有人可以在桌面GPU上复制它 我还测试了一

基本上,我在基于q3的游戏中实现了gamma校正,以消除恼人的问题

我使用GL_EXT_framebuffer_对象作为后期处理顶点着色器。 除了在nvidia GPU上有一些奇怪的行为外,它工作得非常好: 它强制启用vsync,除非在控制面板中显式禁用它如果我使用标准控制面板的设置并启用了帧缓冲区,则强制执行vsync,但如果我删除帧缓冲区,它将恢复正常行为。

  • wglSwapIntervalEXT不执行任何操作
  • 我在nvidia移动GPU上测试了它,有人可以在桌面GPU上复制它
  • 我还测试了一个集成的英特尔gpu和两个不同的amd gpu,它们都没有问题
初始化:(我想不相关)

在帧的末尾:

    qglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, tr.gammaFramebuffer);
    qglBindRenderbufferEXT(GL_RENDERBUFFER_EXT, tr.gammaRenderDepthBuffer);
    qglDrawBuffer(GL_COLOR_ATTACHMENT0_EXT);
    qglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
    qglBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0);

    if (!backEnd.projection2D) {
        qglViewport(0, 0, glConfig.vidWidth, glConfig.vidHeight);
        qglScissor(0, 0, glConfig.vidWidth, glConfig.vidHeight);
        qglMatrixMode(GL_PROJECTION);
        qglLoadIdentity();
        qglOrtho(0, glConfig.vidWidth, glConfig.vidHeight, 0, 0, 1);
        qglMatrixMode(GL_MODELVIEW);
        qglLoadIdentity();

        GL_State(GLS_DEPTHTEST_DISABLE);
    }

    qglUseProgramObjectARB(tr.gammaProgram);
    qglEnable(GL_TEXTURE_2D);

    qglUniform1iARB(tr.gammaSceneBufferLoc, 0);

    qglColor3f(tr.identityLight, tr.identityLight, tr.identityLight);
    qglActiveTextureARB(GL_TEXTURE0);
    qglBindTexture(GL_TEXTURE_2D, tr.gammaRenderTarget);

    qglBegin(GL_QUADS);
    qglTexCoord2f(0, 1);
    qglVertex2f(0, 0);
    qglTexCoord2f(1, 1);
    qglVertex2f(glConfig.vidWidth, 0);
    qglTexCoord2f(1, 0);
    qglVertex2f(glConfig.vidWidth, glConfig.vidHeight);
    qglTexCoord2f(0, 0);
    qglVertex2f(0, glConfig.vidHeight);
    qglEnd();

    qglUseProgramObjectARB(0);

那么,还有什么会导致启用vsync呢?

这可能与使用GL\u FRAMEBUFFER\u EXT调用而不是非EXT版本有关,后者已经存在了很长一段时间了?我记得我曾经遇到过一个问题——与vsync无关,但表明EXT和非EXT之间可能存在差异。。。除此之外,我不知道。我会尝试一下,但我选择扩展的原因是它有稍微更广泛的支持。帧缓冲区从3.0开始就在核心中,例如vmware似乎只支持2.1(我正在测试中):ARB扩展和EXT扩展几乎相同,两个扩展中的所有常量(例如,
GL\u COLOR\u ATTACHMENT0
)都相同。唯一的主要区别在于EXT扩展中的一些额外的验证规则,这些规则是从ARB扩展/核心GL3中删除的。实际上,我认为只要最终用户更新了他们的驱动程序,任何支持EXT扩展的东西都将支持ARB扩展。
    qglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
    qglBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0);

    if (!backEnd.projection2D) {
        qglViewport(0, 0, glConfig.vidWidth, glConfig.vidHeight);
        qglScissor(0, 0, glConfig.vidWidth, glConfig.vidHeight);
        qglMatrixMode(GL_PROJECTION);
        qglLoadIdentity();
        qglOrtho(0, glConfig.vidWidth, glConfig.vidHeight, 0, 0, 1);
        qglMatrixMode(GL_MODELVIEW);
        qglLoadIdentity();

        GL_State(GLS_DEPTHTEST_DISABLE);
    }

    qglUseProgramObjectARB(tr.gammaProgram);
    qglEnable(GL_TEXTURE_2D);

    qglUniform1iARB(tr.gammaSceneBufferLoc, 0);

    qglColor3f(tr.identityLight, tr.identityLight, tr.identityLight);
    qglActiveTextureARB(GL_TEXTURE0);
    qglBindTexture(GL_TEXTURE_2D, tr.gammaRenderTarget);

    qglBegin(GL_QUADS);
    qglTexCoord2f(0, 1);
    qglVertex2f(0, 0);
    qglTexCoord2f(1, 1);
    qglVertex2f(glConfig.vidWidth, 0);
    qglTexCoord2f(1, 0);
    qglVertex2f(glConfig.vidWidth, glConfig.vidHeight);
    qglTexCoord2f(0, 0);
    qglVertex2f(0, glConfig.vidHeight);
    qglEnd();

    qglUseProgramObjectARB(0);