2016-09-21 8 views
-1

私は現在、OpenGLを使用して小さな2Dプラットフォームのプロジェクトに取り組んでおり、学習の練習として大部分を最初からやっています。glfwSwapInterval()はちらつき/壊れた描画を引き起こします

私が現時点で抱えている問題は、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; 
} 

答えて

0

私は最終的に、問題の原因を見つけることができました。

glfwSwapInterval()によって引き起こされたものではありませんが、0に設定すると、フレームレートがはるかに高いために問題が隠されているように見えます。私の頂点シェーダで

、Iは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 
} 
関連する問題