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();
    ...

Ответы (0 шт):