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;
}
明らかに何か不足していますが、何ですか?
'glVertexAttribPointer'レンダリングループで非常に疑わしい見えます。 VAOを使用する全般的なポイントの1つは、パイプラインの入力を1回だけ設定し、次に 'bind vao;を実行することです。ドロー;別のバオをバインドする;描く;なぜあなたは属性を(同じバッファ/フォーマットにもかかわらず)再設定し続けますか? – peppe
次に、頂点シェーダーの外観はどうですか?入力が必要な場所はどこですか?シェーダは、描画する三角形に応じて、別の場所ではなく1つの場所から来る属性を処理する必要があることをシェーダがどのように知ることができますか(それはあなたのコードのすべてです)。 – peppe