私は現在、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;
}