4

次のコードが機能しない理由がわかりません。赤色の三角形と多色の立方体の 2 つの図形を描画しようとしていますが、それらは完全に描画されますが、両方を同時に描画しようとすると、奇妙なバグが発生します。変数を変更してシェーダーを変更する際に行を変更しようとしましたが、希望する結果に近づくことができないようです。現在のコードは、キューブの色を使用する 2 つの同一の三角形を描画してしまいます。

GLuint VertexArrayID;

glGenVertexArrays(1, &VertexArrayID);
glBindVertexArray(VertexArrayID);

GLuint MatrixID = glGetUniformLocation(shader->id(), "MVP");

glm::mat4 Projection = glm::perspective(45.0f, 4.0f / 3.0f, 0.1f, 100.0f);
glm::mat4 View       = glm::lookAt(
glm::vec3(4,2,2), // Camera location
glm::vec3(0,0,0), // and looks at the origin
glm::vec3(0,1,0)  // Head is up (set to 0,-1,0 to look upside-down)
);

glm::mat4 myMatrix = glm::translate(-2.f,0.f,0.f);
glm::mat4 Model = glm::mat4(1.f);
Model= myMatrix * Model;
glm::mat4 MVP = Projection * View * Model;

glm::mat4 myMatrix2 = glm::translate(2.f,0.f,0.f);
glm::mat4 Model2 = glm::mat4(1.f);
Model2= myMatrix2 * Model2;
glm::mat4 MVP2 = Projection * View * Model2;

glViewport(0, 0, windowWidth, windowHeight); // set viewport to the size of the window
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT  | GL_STENCIL_BUFFER_BIT);

shader->bind();
glUniformMatrix4fv(MatrixID, 1, GL_FALSE, &MVP[0][0]);

glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,0,(void*)0);

glEnableVertexAttribArray(1);
glBindBuffer(GL_ARRAY_BUFFER, colourBuffer);
glVertexAttribPointer(1,3,GL_FLOAT,GL_FALSE,0,(void*)0);

glDrawArrays(GL_TRIANGLES,0,12*3);

glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);

glUniformMatrix4fv(MatrixID, 1, GL_FALSE, &MVP2[0][0]);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer2);
glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,0,(void*)0);

glEnableVertexAttribArray(1);
glBindBuffer(GL_ARRAY_BUFFER, colourBuffer2);
glVertexAttribPointer(1,3,GL_FLOAT,GL_FALSE,0,(void*)0);

glDrawArrays(GL_TRIANGLES, 0, 3);
glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);

SwapBuffers(hdc);

glDeleteBuffers(1, &vertexBuffer);
glDeleteBuffers(1, &vertexBuffer2);
glDeleteBuffers(1, &colourBuffer);
glDeleteBuffers(1, &colourBuffer2);
shader->unbind();
glDeleteVertexArrays(1, &VertexArrayID);

それがメインコードです。基本的に次の 3 行のバリエーションを使用して、さまざまなバッファー名とデータを挿入することにより、同様の方法ですべてのバッファーを作成します。

glGenBuffers(1, &vertexBuffer);
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
glBufferData(GL_ARRAY_BUFFER,sizeof(Cube), Cube, GL_STATIC_DRAW);

フラグメントシェーダー

#version 330 core
in vec3 fragmentColour;
out vec3 colour;
void main(){
colour = fragmentColour;
}

頂点シェーダー

  #version 330 core

  uniform mat4 MVP;

  layout(location = 0) in vec3 vertexPosition_modelspace;
  layout(location = 1) in vec3 vertexColour;
  out vec3 fragmentColour;

   void main(){

    gl_Position =  MVP * vec4(vertexPosition_modelspace,1);
    fragmentColour = vertexColour;
   }
4

1 に答える 1

5

VAO を使用しようとしているようですが、作成するのは 1 つだけです。また、なぜ準備するのですか:

glEnableVertexAttribArray(0); glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,0,(void*)0);

glEnableVertexAttribArray(1); glBindBuffer(GL_ARRAY_BUFFER, colorBuffer); glVertexAttribPointer(1,3,GL_FLOAT,GL_FALSE,0,(void*)0);

そして削除:

glDeleteBuffers(1, &vertexBuffer); glDeleteBuffers(1, &vertexBuffer2); glDeleteBuffers(1, &colourBuffer); glDeleteBuffers(1, &colourBuffer2);

各レンダー呼び出しでの VAO ?VAO の全体的な目的は、必要なすべてのバッファーと属性を一度初期化してから、実際のレンダリングのために VAO 自体のみをバインドすることです。初期化セットアップでそれを行い、それらが必要ない場合にのみ削除しますもはやオブジェクト。これが適切に行われる良い例です

あなたがすべきことはこれです: いくつかの init メソッドで VAO を 1 回だけ開始します。次に、レンダー ループで:

   glBindVertexArray(m_VAO1);

   ///draw geometry here

    glBindVertexArray(0);

レンダリングするジオメトリごとにこれを行います。

あなたのコードをより深く見直した後、私はあなたがこれを行うのを見ます:

GLuint VertexArrayID;
glGenVertexArrays(1, &VertexArrayID);
glBindVertexArray(VertexArrayID);

したがって、VAO をバインドします。ただし、作成してバインドするのは 1 つだけです!レンダリング可能なオブジェクトごとに 1 つ作成する必要があります。必要なすべてのバッファをそれにアタッチし、上で説明したようにレンダリング ループで使用します。

于 2013-04-16T13:15:16.323 に答える