2016-11-17 15 views
0

OpenGL 3.3のウィンドウに2つの三角形を描画しようとしています。私は、ウィンドウシステムにGLFWライブラリを使用しています。2つのVBOを含む1つのVAOをレンダリングする

私が理解から、私は2 VBOs(各三角形に1つ)と1 VAOこれら2 VBOsを含むを持っている必要があります。それが私のしたことです。

しかし、私はこれらの2つのVBOをレンダリングするためにどのような呼び出しを行うべきかわかりません。実際、私が何をしても最初に VBO(最初の三角形)が描かれます。 2つ目は決して現れません。

int main() 
{ 
    GLFWwindow *window = setupWindow(); 
    GLfloat triangle1Vertices[] = { 
     -0.5f, -0.5f, 0.0f, 
     0.5f, -0.5f, 0.0f, 
     0.0f, 0.5f, 0.0f 
    }; 
    GLfloat triangle2Vertices[] = { 
     0.f, -0.5f, 0.0f, 
     0.8f, -0.5f, 0.0f, 
     0.0f, 0.5f, 0.0f 
    }; 
    GLuint vao, vbo[2]; 

    glGenVertexArrays(1, &vao); 
    glGenBuffers(2, vbo); 

    glBindVertexArray(vao); 

    glBindBuffer(GL_ARRAY_BUFFER, vbo[0]); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(triangle1Vertices), triangle1Vertices, GL_STATIC_DRAW); 
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (GLvoid*)0); 
    glEnableVertexAttribArray(0); 

    glBindBuffer(GL_ARRAY_BUFFER, vbo[1]); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(triangle2Vertices), triangle2Vertices, GL_STATIC_DRAW); 
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, (GLvoid*)0); 
    glEnableVertexAttribArray(1); 

    glBindBuffer(GL_ARRAY_BUFFER, 0); 
    glBindVertexArray(0); 

    while (!glfwWindowShouldClose(window)) 
    { 
     glfwPollEvents(); 

     glClearColor(0.3f, 0.3f, 0.5f, 1.0f); 
     glClear(GL_COLOR_BUFFER_BIT); 


     glBindVertexArray(vao); 

     glBindBuffer(GL_ARRAY_BUFFER, vbo[0]); 
     glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (GLvoid*)0); 
     glDrawArrays(GL_TRIANGLES, 0, 3); 

     glBindBuffer(GL_ARRAY_BUFFER, vbo[1]); 
     glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, (GLvoid*)0); 
     glDrawArrays(GL_TRIANGLES, 0, 3); 

     glBindVertexArray(0); 


     glfwSwapBuffers(window); 
    } 

    glDeleteVertexArrays(1, &vao); 
    glDeleteBuffers(2, vbo); 

    glfwTerminate(); 

    return 0; 
} 

明らかに何か不足していますが、何ですか?

+0

'glVertexAttribPointer'レンダリングループで非常に疑わしい見えます。 VAOを使用する全般的なポイントの1つは、パイプラインの入力を1回だけ設定し、次に 'bind vao;を実行することです。ドロー;別のバオをバインドする;描く;なぜあなたは属性を(同じバッファ/フォーマットにもかかわらず)再設定し続けますか? – peppe

+0

次に、頂点シェーダーの外観はどうですか?入力が必要な場所はどこですか?シェーダは、描画する三角形に応じて、別の場所ではなく1つの場所から来る属性を処理する必要があることをシェーダがどのように知ることができますか(それはあなたのコードのすべてです)。 – peppe

答えて

2

私が理解するところでは、2つのVBO(各三角形に1つ)と1つのVAOに2つのVBOが含まれている必要があります。

あなたの理解は間違っています。

2つの異なる三角形を持つ2つの異なるバッファを使用する場合は、2つの異なるVAOが必要です。またはVAOが各オブジェクトのレンダリングの間に使用するバッファを交換する必要があります。二glVertexAttribPointer呼び出しは、同様の属性0を使用していることを

glBindVertexArray(vao); 

    glBindBuffer(GL_ARRAY_BUFFER, vbo[0]); 
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (GLvoid*)0); 
    glDrawArrays(GL_TRIANGLES, 0, 3); 

    glBindBuffer(GL_ARRAY_BUFFER, vbo[1]); 
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (GLvoid*)0); 
    glDrawArrays(GL_TRIANGLES, 0, 3); 

Notive:

あなたのレンダリングコードを修正するために近いですが、なく、かなり。 glVertexAttribPointerに渡すアトリビュートインデックスは、その配列からどのシェーダ入力変数が供給されるかを指定します。あなたがしようとしているのは、同じシェーダーを使って2つ目のオブジェクトをレンダリングし、頂点配列がどこから来るかだけを変更することです。そのためには、同じ属性インデックスを使用する必要があります。

ただし、OpenGL 4.3/ARB_vertex_attrib_bindingが利用可能な場合はI would highly encourage you to just use those APIsです。あなたのループで、その後

//vertex setup 
glGenVertexArrays(1, &vao); 

glBindVertexArray(vao); 
//Sets up the format, *without* a buffer object. 
glVertexAttribFormat(0, 3, GL_FLOAT, GL_FALSE, 0); 
//Sets up where the buffer object comes from 
glVertexAttribBinding(0, 0); 
//Done with VAO 
glBindVertexArray(0); 

//Set up buffer object data storage. 
glGenBuffers(2, vbo); 
glBindBuffer(GL_ARRAY_BUFFER, vbo[0]); 
glBufferData(GL_ARRAY_BUFFER, sizeof(triangle1Vertices), triangle1Vertices, GL_STATIC_DRAW); 
glBindBuffer(GL_ARRAY_BUFFER, vbo[1]); 
glBufferData(GL_ARRAY_BUFFER, sizeof(triangle2Vertices), triangle2Vertices, GL_STATIC_DRAW); 
glBindBuffer(GL_ARRAY_BUFFER, 0); 

:それはずっとより簡単にコードを作る

glBindVertexArray(vao); 

//Use buffer 0 to render. 
glBindVertexBuffer(0, vbo[0], 0, 3 * sizeof(float)); 
glDrawArrays(GL_TRIANGLES, 0, 3); 
//Use buffer 1 to render. 
glBindVertexBuffer(0, vbo[1], 0, 3 * sizeof(float)); 
glDrawArrays(GL_TRIANGLES, 0, 3); 

glBindVertexArray(0); 
関連する問題