Путаница возникает из-за того, что шейдер управляет несколькими массивами вершин одновременно, когда его следует рассматривать как универсальную сущность. Массив вершин передается шейдеру, затем объект рисуется. И процесс повторяется.
Например, допустим, мы присвоили переменную matrixID униформе MVP :
// get handle for our "MVP" uniform
GLuint matrixID = glGetUniformLocation(programID, "MVP");
Когда мы готовы нарисовать объект, мы устанавливаем matrixID для MVP объекта:
glUniformMatrix4fv(matrixID, 1, GL_FALSE, &cubeMVP[0][0]);
Затем свяжите буфер вершин, установите указатель атрибута и нарисуйте его:
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, cubeVerteciesBuffer);
glVertexAttribPointer(
0, // shader layout location
3,
GL_FLOAT,
GL_FALSE,
0,
(void *)0
);
glDrawArrays(GL_TRIANGLES, 0, 12*3); // draw cube
Теперь мы переходим к треугольнику и повторяем процесс - установите matrixID на MVP объекта, привяжите буфер вершин, установите указатель атрибута и нарисуйте его:
glUniformMatrix4fv(matrixID, 1, GL_FALSE, &triMVP[0][0]);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, triangleVerteciesBuffer);
glVertexAttribPointer(
0, // shader layout location
3,
GL_FLOAT,
GL_FALSE,
0,
(void *)0
);
glDrawArrays(GL_TRIANGLES, 0, 3); // draw triangle
Соответствующий код вершинного шейдера:
#version 330 core
// Input vertex data, different for all executions of this shader.
layout(location = 0) in vec3 vertecies_modelspace;
uniform mat4 MVP;
void main(){
gl_Position = MVP * vec4(vertecies_modelspace, 1);
}