VBO: массив не нарисован

Я следую этому руководству и пытаюсь нарисовать четырехугольник на экран. Я тоже видел исходник, он такой же и должен работать, но в моем случае на экран ничего не выводится. Я использую OpenGL 2.0 с вершинным шейдером, который просто устанавливает красный цвет таким образом, чтобы четырехугольник был виден на экране.

Перед вызовом glutMainLoop я генерирую объект буфера вершин:

#include <GL/glut.h>
#include <GL/glew.h>

vector<GLfloat> quad; 
GLuint buffer;

void init()
{
    // This routine gets called before glutMainLoop(), I omitted all the code
    // that has to do with shaders, since it's correct.
    glewInit();
    quad= vector<GLfloat>{-1,-1,0, 1,-1,0, 1,1,0, -1,1,0};
    glGenBuffers(1,&buffer);
    glBindBuffer(GL_ARRAY_BUFFER, buffer);
    glBufferData(GL_ARRAY_BUFFER,sizeof(GLfloat)*12,quad.data(),GL_STATIC_DRAW);
}

Это моя процедура рендеринга:

void display()
{
    glClearColor(0,0,0,0);
    glClear(GL_COLOR_BUFFER_BIT);

    glEnableVertexAttribArray(0);
    glBindBuffer(GL_ARRAY_BUFFER,buffer);
    glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,0,0);
    // I also tried passing quad.data() as last argument, but nothing to do.
    glDrawArrays(GL_QUADS,0,12);
    glDisableVertexAttribArray(0);

    glutSwapBuffers();
}

Проблема в том, что на экран ничего не прорисовывается, я просто вижу черное окно. Четырехугольник должен быть красным, потому что я установил красный цвет в вершинном шейдере.


person Ramy Al Zuhouri    schedule 30.01.2013    source источник
comment
с вершинным шейдером, который просто устанавливает красный цвет. Тогда покажите нам свой вершинный и фрагментный шейдер. Кстати, вы уверены, что ваш вершинный шейдер задает цвет?   -  person Christian Rau    schedule 30.01.2013
comment
Также покажите остальную часть вашей установки, где вы компилируете и связываете шейдеры и все такое.   -  person Christian Rau    schedule 30.01.2013
comment
У меня та же проблема, даже если я не использую шейдер и устанавливаю цвет с помощью glColor3f или с помощью GL_COLOR_ARRAY.   -  person Ramy Al Zuhouri    schedule 31.01.2013


Ответы (2)


Так что, возможно, проблема в счетчике в glDrawArrays(GL_QUADS, 0, 12); который должен быть glDrawArrays(GL_QUADS, 0, 4);

person Anthony    schedule 30.01.2013
comment
Шаг, если промежуток между последовательными элементами. - person Ramy Al Zuhouri; 30.01.2013
comment
Так что, возможно, проблема в счетчике в glDrawArrays(GL_QUADS, 0, 12); который должен быть glDrawArrays(GL_QUADS, 0, 4); - person Anthony; 30.01.2013
comment
Верно, но он все еще не рисует квадроцикл. - person Ramy Al Zuhouri; 30.01.2013
comment
Вы также можете использовать 0 как шаг, если атрибуты плотно упакованы, как в его случае. Но на самом деле ваш комментарий совершенно правильный (и может быть решением его проблемы). Поэтому я предлагаю вам заменить ваш текущий ответ своим комментарием (который, по крайней мере, принесет вам +2 от меня). - person Christian Rau; 30.01.2013
comment
@RamyAlZuhouri Шаг — это промежуток между последовательными элементами. Нет, это не так. На самом деле это разрыв между началом одного элемента и началом следующего, поэтому его 3*sizeof(float) действительно правильный. Однако вы правы в том, что это все еще не решение вашей проблемы, поскольку в вашем случае также работает шаг 0. - person Christian Rau; 30.01.2013

Мне не хватало glEnableClientState следующим образом:

glEnableClientState(GL_VERTEX_ARRAY);
glDrawArrays(GL_QUADS,0,12);
glDisableClientState(GL_VERTEX_ARRAY);
person Ramy Al Zuhouri    schedule 31.01.2013