OpenGL: проблема с буфером индексов вершин - PullRequest
4 голосов
/ 06 февраля 2011

Я только начал использовать VBO, и все, кажется, в порядке, за исключением буфера индексов вершин. Если я вызываю glDrawElements после включения буфера индексов, я получаю ошибку нарушения доступа (не могу найти индексы), и если я просто вызываю ее с указателем на начало массива индексов в памяти, это работает ..

//DOESN'T WORK
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indices);
glDrawElements(GL_TRIANGLES, stripIndices.size(), GL_UNSIGNED_INT, 0);

//WORKS
glDrawElements(GL_TRIANGLES, stripIndices.size(), GL_UNSIGNED_INT, &stripIndices[0]);

Я думаю, что я все делаю правильно при настройке, но все же я выложу некоторый код:

glGenBuffers(1,&vtxBuffer);
glGenBuffers(1,&nrmBuffer);
glGenBuffers(1,&clrBuffer);
glGenBuffers(1,&indices);

glBindBuffer(GL_ARRAY_BUFFER, vtxBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*vertices.size(), 
    &vertices[0], GL_STATIC_DRAW);

glBindBuffer(GL_ARRAY_BUFFER, nrmBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*normals.size(),
    &normals[0], GL_STATIC_DRAW);

glBindBuffer(GL_ARRAY_BUFFER, clrBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*colors.size(),
    &colors[0], GL_STATIC_DRAW);

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indices);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLuint)*stripIndices.size(),
    &stripIndices[0], GL_STATIC_DRAW);

И рисовать я делаю:

glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);

glPushMatrix();
    glRotatef(25.f,0.f,1.f,0.f);
    s->draw();
glPopMatrix();

glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);

Вызов s-> draw ():

glBindBuffer(GL_ARRAY_BUFFER, vtxBuffer);
glVertexPointer(3,GL_FLOAT,0,&vertices[0]);

glBindBuffer(GL_ARRAY_BUFFER, clrBuffer);
glNormalPointer(GL_FLOAT,0,&colors[0]);

glBindBuffer(GL_ARRAY_BUFFER, clrBuffer);
glColorPointer(3,GL_FLOAT,0,&clrVtx[0]);

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indices);
glDrawElements(GL_TRIANGLES, stripIndices.size(), GL_UNSIGNED_INT, &stripIndices[0]);

(примечание: во всех вызовах pointer / drawElements вместо указателей & .. [0] в конце я хотел бы использовать индекс вершинного буфера, но не могу).

Вот где возникает проблема. Я не понимаю Я генерирую объект буфера, заполняю его данными индексов, но когда дело доходит до рисования, кажется, что он его не находит. У кого-нибудь есть идеи, как решить эту проблему?

Спасибо

EDIT: мне кажется, что компилятор интерпретирует смещение '0' в объект буфера как указатель на местоположение '0' в памяти, которое выдает ошибку нарушения доступа.

Ответы [ 2 ]

2 голосов
/ 06 февраля 2011

Вы должны попробовать:

glBindBuffer(GL_ARRAY_BUFFER, vtxBuffer);
glVertexPointer(3,GL_FLOAT,0,0L);

glBindBuffer(GL_ARRAY_BUFFER, clrBuffer);
glColorPointer(3,GL_FLOAT,0,0L);

Когда буфер связан, последний аргумент вызовов gl*Pointer является смещением в буфере графического процессора, а не адресом памяти.

EDIT

Кажется, что ваши индексы имеют тип int (глядя на ваш glBufferData), но вы используете их без знака в glDrawElements.

0 голосов
/ 07 февраля 2011

Вы, вероятно, пропускаете звонок на

glEnableClientState(GL_INDEX_ARRAY)

...

glDisableClientState(GL_INDEX_ARRAY)

Это позволяет gl знать, что индексы исходят от объекта, а не от прямого указателя.
Боже, я ненавижу эти функции.

...