glfwSwapInterval()导致闪烁/断开绘图

时间:2016-09-21 13:33:24

标签: c++ opengl glsl glfw

我目前正在使用OpenGL开展一个小型平台游戏项目,试图从头开始做大部分事情作为学习练习。

我目前遇到的问题似乎与使用glfwSwapInterval(n);有关。当我将交换间隔设置为0(即,没有vsync)时,GameObject I渲染渲染完全正常,并且平滑移动。将其设置为1会导致对象无法渲染,或者闪烁并且角落会四处跳跃。将其设置为更高的值会使问题恶化。

我认为相关的代码如下。

game.cpp(主要游戏类):

void Game::runGame()
{
    // Some init things here but not important
    while (!glfwWindowShouldClose(_disp.getWindow()))
    {
        // delta is set up here
        glfwPollEvents();
        for (auto& obj : _gobs) { obj->update(delta) };
        _disp.checkInput(_cont.getKeys()); // Only checks for Esc press to close window
        _disp.render(_gobs);
    }
    _disp.close();
}

display.cpp(处理窗口创建):

bool Display::initGL()
{
    // Majority of window creation code is above here, but generic and probably irrelevant
    glViewport(0, 0, _scrWidth, _scrHeight);
    glfwSwapInterval(0); // Seems to cause flickering with nonzero values
    glfwSetInputMode(_window, GLFW_CURSOR, GLFW_CURSOR_DISABLED);

    return true;
}

void Display::render(std::vector<std::shared_ptr<GameObject>> gobs)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    for (auto& obj : gobs) { obj->render(); }
    glfwSwapBuffers(_window);
}

gameobject.cpp(对象类):

void GameObject::render()
{
    if (_vaoid)
    {
        _shader.use();
        glBindVertexArray(_vaoid);
            glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
        glBindVertexArray(0);
    }
}

有没有人对可能导致这种情况的原因有任何想法?我觉得我一定错过了一个窗口提示或类似的东西,但我找不到任何提到这些的文档。

编辑:导致问题的着色器代码: basicvert.vs:

#version 330 core

layout (location = 0) in vec2 position;

void main()
{
    gl_Position.xy = position;
    gl_Position.z = 0.0f;
}

1 个答案:

答案 0 :(得分:0)

我最终找到了问题的原因。

事实证明,它不是由glfwSwapInterval()引起的 - 但是,由于帧率更高,将其设置为0似乎只是掩盖了问题。

在我的顶点着色器中,我作为vec2传递位置,并按如下方式设置gl_Position:

#version 330 core

layout (location = 0) in vec2 position;

void main()
{
    gl_Position.xy = position;
    gl_Position.z = 0.0f;
    // gl_Position.w does not get set -> left as an undefined value?
}

结果,没有设置gl_Position的w分量。将此设置为1.0f解决了问题:

#version 330 core

layout (location = 0) in vec2 position;

void main()
{
    gl_Position = vec4(position, 0.0f, 1.0f); // Works
}