OpenGL не работает передача атрибутов из массива в видеокарту
Суть в том, что я пытаюсь передать в атрибуты вершин значения из массива. (Позиции вершин хранятся в VBO) Но ничего не происходит! При том в видео, с которого я пишу код, все работает. В документации OpenGL (например тут) ничего полезного нет.
Код.
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
// Вершинный и фрагментный шейдеры.
// TODO: сделать загрузку шейдеров из файла
GLuint vertex_shader = createAndCompileShader(R"(
#version 110
attribute vec3 a_color;
varying vec3 v_color;
void main() {
v_color = a_color;
gl_Position = gl_ModelViewMatrix * gl_Vertex;
}
)", GL_VERTEX_SHADER);
GLuint fragment_shader = createAndCompileShader(R"(
#version 110
varying vec3 v_color;
void main() {
gl_FragColor = vec4(v_color, 1.0);
}
)", GL_FRAGMENT_SHADER);
GLuint program = createProgram(vertex_shader, fragment_shader);
// Координаты вершин
static const float vertex[] {
1.0f, 0.0f, 0.0f,
0.0f, 1.0f, 0.0f,
1.0f, 1.0f, 0.0f,
};
// Цвета вершин
static const float colors[] {
1.0f, 0.0f, 0.0f,
0.0f, 1.0f, 0.0f,
0.0f, 0.0f, 1.0f,
};
glUseProgram(program);
// VBO вершин
GLuint pos_vbo = 0;
glGenBuffers(1, &pos_vbo);
glBindBuffer(GL_ARRAY_BUFFER, pos_vbo);
glBufferData(GL_ARRAY_BUFFER, 9 * 4, vertex, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
// VBO цветов
GLuint color_vbo = 0;
glGenBuffers(1, &color_vbo);
glBindBuffer(GL_ARRAY_BUFFER, color_vbo);
glBufferData(GL_ARRAY_BUFFER, 9 * 4, colors, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
GLint color_attrib_location = glGetAttribLocation(program, "a_color");
glUseProgram(0);
Цикл отрисовки:
...
glPushMatrix();
glOrtho(-window.getAspect(), window.getAspect(), -1.0, 1.0, 0.0, 100.0);
glUseProgram(program);
glBindBuffer(GL_ARRAY_BUFFER, color_vbo);
glVertexAttribPointer(color_attrib_location, 3, GL_FLOAT, false, 0, NULL);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ARRAY_BUFFER, pos_vbo);
glVertexPointer(3, GL_FLOAT, 0, NULL);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableVertexAttribArray(color_vbo);
glDrawArrays(GL_TRIANGLES, 0, 9);
glDisableVertexAttribArray(color_vbo);
glDisableClientState(GL_VERTEX_ARRAY);
glUseProgram(0);
glPopMatrix();
...