次の非常に単純な頂点シェーダーがあります。レンダリングすると、空白の画面が表示されます。
#version 110
layout(location = 1) attribute vec3 position;
uniform mat4 modelview_matrix;
uniform mat4 projection_matrix;
void main() {
vec4 eye = modelview_matrix * vec4(position, 1.0);
gl_Position = projection_matrix * eye;
}
ただし、変更
layout(location = 1) attribute vec3 position;
に
layout(location = 0) attribute vec3 position;
正しくレンダリングできます。これが私のレンダリング関数です:
glUseProgram(program);
GLenum error;
glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glUniformMatrix4fv(
modelview_uniform, 1, GL_FALSE, glm::value_ptr(modelview));
glUniformMatrix4fv(
projection_uniform, 1, GL_FALSE, glm::value_ptr(projection));
glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
glVertexAttribPointer(
position_attribute,
3,
GL_FLOAT,
GL_FALSE,
0,
(void*)0);
glEnableVertexAttribArray(position_attribute);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, element_buffer);
glDrawElements(
GL_TRIANGLES,
monkey_mesh.indices.size(),
GL_UNSIGNED_INT,
(void*)0);
glDisableVertexAttribArray(position_attribute);
glutSwapBuffers();
position_attribute
を呼び出して取得しglGetAttribLocation(program, "position");
ます。どちらの場合も正しい値が含まれています (最初のケースでは 1、2 番目のケースでは 0)。
私が間違っていることはありますか?運が良かったという理由だけでいつレンダリングできると確信してlocation == 0
おり、データはまったくの運によってそこに書き込まれますが、どのステップが欠けているのか一生わかりません。