OpenGL: попытаться нарисовать линии, используя VBO(объект буфера вершин), он не отображается

Я пытаюсь переключить свой код openGL с использования списка отображения на использование VBO. В коде я попытался нарисовать пол с зеленой сеткой, который состоит из зеленых линий, параллельных оси x, и зеленых линий, параллельных оси z. Но когда программа запускается, слово floor не отображается. И я не могу найти, где идет не так.

Вот мой код инициализации VBO пола:

//**********************************
//defined in head of my source code
struct BufferVBO1
{
    GLfloat x;
    GLfloat y;
    GLfloat z;
    GLfloat r;
    GLfloat g;
    GLfloat b;
};
struct IdVBO
{
    GLuint id;
    size_t bufsiz;
};
IdVBO vboGround;
//**************************************
glGenBuffers(1, &vboGround.id);
int groundSiz1 = ( (floorEdge_x_max-floorEdge_x_min)/(5*LENGTH_UNIT)+1 )*2 ;
int groundSiz2 = ( (floorEdge_z_max-floorEdge_z_min)/(5*LENGTH_UNIT)+1 )*2 ;
vboGround.bufsiz = groundSiz1+groundSiz2 ;
BufferVBO1 *groundBuf = new BufferVBO1 [vboGround.bufsiz];
for(int i=0, idx=0; idx<groundSiz1; ++i)
{
    groundBuf[idx].x = floorEdge_x_min+i*5*LENGTH_UNIT;
    groundBuf[idx].y = 0;
    groundBuf[idx].z = floorEdge_z_min;
    groundBuf[idx].r = 75/255.0;
    groundBuf[idx].g = 1.0;
    groundBuf[idx].b = 63/255.0;
    ++idx;

    groundBuf[idx].x = floorEdge_x_min+i*5*LENGTH_UNIT;
    groundBuf[idx].y = 0;
    groundBuf[idx].z = floorEdge_z_max;
    groundBuf[idx].r = 75/255.0;
    groundBuf[idx].g = 1.0;
    groundBuf[idx].b = 63/255.0;
    ++idx;
}
for(int i=0, idx=groundSiz1; idx<vboGround.bufsiz; ++i)
{
    groundBuf[idx].x = floorEdge_x_min;
    groundBuf[idx].y = 0;
    groundBuf[idx].z = floorEdge_z_min+i*5*LENGTH_UNIT;
    groundBuf[idx].r = 75/255.0;
    groundBuf[idx].g = 1.0;
    groundBuf[idx].b = 63/255.0;
    ++idx;

    groundBuf[idx].x = floorEdge_x_max;
    groundBuf[idx].y = 0;
    groundBuf[idx].z = floorEdge_z_min+i*5*LENGTH_UNIT;
    groundBuf[idx].r = 75/255.0;
    groundBuf[idx].g = 1.0;
    groundBuf[idx].b = 63/255.0;
    ++idx;
}

glBindBuffer(GL_ARRAY_BUFFER, vboGround.id);
glBufferData(GL_ARRAY_BUFFER, sizeof(BufferVBO1)*vboGround.bufsiz, groundBuf, GL_STATIC_DRAW);
delete [] groundBuf ;
glBindBuffer(GL_ARRAY_BUFFER, 0);

Вот код для отображения:

 glDisable(GL_LIGHTING);
 glBindBuffer(GL_ARRAY_BUFFER, vboGround.id);
 glEnableClientState(GL_VERTEX_ARRAY);
 glVertexPointer(3, GL_FLOAT, sizeof(BufferVBO1), (void*)0);
 glEnableClientState(GL_COLOR_ARRAY);
 glColorPointer( 3, GL_FLOAT, sizeof(BufferVBO1), (void*)(sizeof(GLfloat)*3) );
 for(int i=0; i<vboGround.bufsiz; i+=2)
    glDrawArrays(GL_LINE, i, 2);
 glDisableClientState(GL_VERTEX_ARRAY);
 glDisableClientState(GL_COLOR_ARRAY);
 glBindBuffer(GL_ARRAY_BUFFER, 0);
 glEnable(GL_LIGHTING);

Я пытался нарисовать простой пол GL_QUADS, используя VBO, и это работает! Но когда я попытался нарисовать пол с зеленой сеткой, он не отображается.

Скажи мне, где проблема.

1 ответ

Решение

Первый аргумент glDrawArrays() здесь недействительно:

glDrawArrays(GL_LINE, i, 2);

GL_LINE не является допустимым типом примитива. Вам нужно использовать GL_LINES:

glDrawArrays(GL_LINES, i, 2);

GL_LINE может выглядеть очень похоже, но это один из возможных аргументов для glPolygonMode(),

Вы должны всегда звонить glGetError() когда ваш вызов OpenGL ведет себя не так, как ожидалось. В этом случае он должен был вернуться GL_INVALID_ENUM,

Кстати, вы можете нарисовать все линии в одном glDrawArrays() вызов вместо использования цикла:

glDrawArrays(GL_LINES, 0, vboGround.bufsize);
Другие вопросы по тегам