2013-05-13 1 views
0

Я пытаюсь преобразовать следующий фрагмент кода в один, который использует буфер вершин:«Нарушение прав доступа Чтение Location» с Vertex Buffer

glBegin (GL_QUADS); 
glTexCoord2fv (&_vertex[ci->index_list[7]].uv.x); 
glVertex3fv (&_vertex[ci->index_list[7]].position.x); 
glVertex3fv (&_vertex[ci->index_list[5]].position.x); 
glVertex3fv (&_vertex[ci->index_list[3]].position.x); 
glVertex3fv (&_vertex[ci->index_list[1]].position.x); 
glEnd(); 

Мой ошибочный код частично выглядит следующим образом:

GLfloat * p = (GLfloat *) malloc(sizeof(GLfloat)*14); 
//Memcopies vertices into p pointer 
memcpy(&p[counter+0], &_vertex[ci->index_list[7]].uv.x, sizeof(GLfloat)*2); 
memcpy(&p[counter+2], &_vertex[ci->index_list[7]].position.x, sizeof(GLfloat)*3); 
memcpy(&p[counter+5], &_vertex[ci->index_list[5]].position.x, sizeof(GLfloat)*3); 
memcpy(&p[counter+8], &_vertex[ci->index_list[3]].position.x, sizeof(GLfloat)*3); 
memcpy(&p[counter+11], &_vertex[ci->index_list[1]].position.x, sizeof(GLfloat)*3); 

glGenBuffers(1, &vboId1); 
glBindBuffer(GL_ARRAY_BUFFER, vboId1); 
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*14, p, GL_STATIC_DRAW_ARB); 

glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
glEnableClientState(GL_VERTEX_ARRAY); 

glTexCoordPointer(2, GL_FLOAT, sizeof(GLfloat)*14, (GLfloat*)0); 
glVertexPointer(3, GL_FLOAT, 0, 2+(GLfloat*)0); 
glDrawArrays(GL_QUADS, 0, 1); 

glDisableClientState(GL_TEXTURE_COORD_ARRAY); 
glDisableClientState(GL_VERTEX_ARRAY); 
glBindBuffer(GL_ARRAY_BUFFER, 0); 

Однако в строке glDrawArrays появляется ошибка «Ошибка чтения нарушения прав доступа». Какие-нибудь идеи, что может быть неправильно здесь? Я очень новичок в OpenGL/графике и довольно уверен, что я испортил что-то очевидное.

ответ

0

Это не сработает. Непосредственный режим позволял вам отказаться от изменения неизменных атрибутов между вершинами. Но с массивами вершин вы не можете этого сделать. То, что вы сейчас делаете, говорит GL, что он находит TexCoords i-й ​​вершины в смещении байта 14 * sizeof (GLfloat) * i в буфере. Для первой вершины она будет работать, но для второго вы пытаетесь получить доступ к данным за пределами буфера.

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

Лучше просмотреть вершину как не только позицию (указанную командой glVertex), но и полный n-tupel соответствующих атрибутов. Если любой отдельный компонент любой атрибут отличается, его больше нельзя считать той же самой вершиной.

Смежные вопросы