Я только начал использовать 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' в памяти, которое выдает ошибку нарушения доступа.