2017-01-31 9 views
1

私はgl画面に何も描画できません。画面をクリアするだけです。メイン、ディスプレイ、キューブのクラスがあります。OpenGL 3.3は何も描画できません

main.cppに

Display d(800, 600, "Hi"); 
while (!d.IsClosed()) { 
    d.Clear(); 
    d.Update(); 
} 
return 0; 

display.cpp

コンストラクタGLFWとGLEW初期化します。

void Display::Update() { 
    glfwPollEvents(); 
    m_shader->UseProgram(); 
    m_renderer->Render(*m_cube); 
    glfwSwapBuffers(m_window); 
} 

UseProgram関数はShaderクラスのもので、ちょうどglUseProgram(m_programID);です。

m_renderer->Render()は、パラメータ内のオブジェクトからRender関数を呼び出すだけです。

cube.cpp

void Cube::Init() { 
//cube vertices - colors 
GLfloat data[] = { 
    -0.5f, 0.5f, 0.0f, m_color.r, m_color.g, m_color.b, m_color.a, 
    -0.5f, -0.5f, 0.0f, m_color.r, m_color.g, m_color.b, m_color.a, 
    0.5f, -0.5f, 0.0f, m_color.r, m_color.g, m_color.b, m_color.a, 
    0.5f, 0.5f, 0.0f, m_color.r, m_color.g, m_color.b, m_color.a, 

    -0.5f, 0.5f, -0.5f, m_color.r, m_color.g, m_color.b, m_color.a, 
    -0.5f, -0.5f, -0.5f, m_color.r, m_color.g, m_color.b, m_color.a, 
    0.5f, -0.5f, -0.5f, m_color.r, m_color.g, m_color.b, m_color.a, 
    0.5f, 0.5f, -0.5f, m_color.r, m_color.g, m_color.b, m_color.a 
}; 

//cube indices 
GLuint indices[] = { 
    //front 
    0, 1, 2, 
    0, 2, 3, 

    //top 
    4, 0, 3, 
    4, 3, 7, 

    //bottom 
    1, 3, 6, 
    1, 6, 2, 

    //left 
    4, 3, 1, 
    4, 1, 0, 

    //right 
    3, 2, 6, 
    3, 6, 7, 

    //back 
    4, 5, 6, 
    4, 6, 7, 
}; 

m_vertexCount = sizeof(indices)/sizeof(GLuint); 

//Generate buffers 
glGenVertexArrays(1, &m_vaoID); 
glGenBuffers(1, &m_vboID); 
glGenBuffers(1, &m_eboID); 

//Bind vertex array object 
glBindVertexArray(m_vaoID); 

//Bind vertex buffer object 
glBindBuffer(GL_ARRAY_BUFFER, m_vboID); 
glBufferData(GL_ARRAY_BUFFER, sizeof(data), data, GL_STATIC_DRAW); 
glEnableVertexAttribArray(0); 
glEnableVertexAttribArray(1); 
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GL_FLOAT), (GLvoid*)0); 
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 4 * sizeof(GL_FLOAT), (GLvoid*)(3 * sizeof(GL_FLOAT))); 

//Unbind vertex buffer object 
glBindBuffer(GL_ARRAY_BUFFER, 0); 

//Bind Element buffer object 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_eboID); 
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW); 
//Unbind Element buffer object 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); 

//Unbind vertex array object 
glBindVertexArray(0); 
} 

Init()関数がコンストラクタから呼び出されます。これはすべてキューブ初期化コードです。配列のバインドとバインドを解除するだけです。

void Cube::Render() { 
glBindVertexArray(m_vaoID); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_eboID); 
glDrawElements(GL_TRIANGLES, m_vertexCount, GL_UNSIGNED_INT, 0); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); 
glBindVertexArray(0); 
} 

問題は何か分かりません。画面には何も表示されません。もしあなたが私のシェイダークラスを投稿することもできます。

+0

シェーダのクラスとソースを表示できますか? VAOがバウンドインデックスバッファを保存するので、 'Init()'の 'glBindBuffer(GL_ELEMENT_ARRAY_BUFFER、0);'と 'Render()'の他の呼び出しを削除することもできます。 – Nazar554

答えて

2

ストライドパラメータが間違っています。連続した各位置の開始位置は、最後の位置の開始位置から浮動します。色も同じです。正しいコードは、このようにあなたが効果的に結合を削除し、

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 7 * sizeof(GL_FLOAT), (GLvoid*)0); 
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 7 * sizeof(GL_FLOAT), (GLvoid*)(3 * sizeof(GL_FLOAT))); 

もう一つは、あなたがVAOのバインドを解除する前に、インデックスバッファのバインドを解除していることであるだろう。 VAOのセットアップの最後の行がなければならない:

//Bind Element buffer object 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_eboID); 
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW); 

//Unbind vertex array object 
glBindVertexArray(0); 

//Unbind Element buffer object 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); 

また、Render()機能でGL_ELEMENT_ARRAY_BUFFERの非結合/結合を削除する必要があります。

+0

ありがとうございます。ストライド値を変更すると、正しく実行されます。 – Stradivarius

関連する問題