Почему я получаю ошибки нарушения доступа с моим буферным объектом Vertex? - PullRequest
0 голосов
/ 05 февраля 2019

Это мои typdefs / global variable:

static GLuint GL15_vbo[2];

typedef struct {
    fvec3 pos;
    fvec3 col;
    fvec2 uv;
} MyVertex;

typedef struct {
    GLuint a;
    GLuint b;
    GLuint c;
} TriFace;

Это мой код инициализации:

glGenBuffers(2, (GLuint *)&GL15_vbo);

glBindBuffer(GL_ARRAY_BUFFER, GL15_vbo[0]);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, GL15_vbo[1]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(faces), faces, GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

Это мой код рендеринга:

glVertexPointer(3, GL_FLOAT, sizeof(MyVertex), (const void *)(offsetof(MyVertex, pos)));
glColorPointer(3, GL_FLOAT, sizeof(MyVertex), (const void *)(offsetof(MyVertex, col)));
glTexCoordPointer(3, GL_FLOAT, sizeof(MyVertex), (const void *)(offsetof(MyVertex, uv)));

glBindBuffer(GL_ARRAY_BUFFER, GL15_vbo[0]);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, GL15_vbo[1]);

glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);

for (int iface = 0; iface < 12; iface++) {
    glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, (const void *)(iface * sizeof(TriFace)));
}

glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);

glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

Можете ли вы сказать мне, что не так с моим кодом?Я получаю нарушение прав доступа в glDrawElements.Он хорошо работает с простыми вершинными массивами (поэтому массивы данных хорошо инициализируются).Спасибо.

1 Ответ

0 голосов
/ 05 февраля 2019

Последний параметр glVertexPointer, glColorPointer и glTexCoordPointer должен быть указателем на первую координату вершины или первый атрибут,

Если привязан ненулевой именованный объект буфера, то параметр обрабатывается как смещение байта в хранилище данных объекта буфера массива.

Вы хотите использовать буфер именованного массива иПараметры - это правильные смещения атрибутов.Но объект буфера не привязан в этой точке, потому что вы делаете glBindBuffer(GL_ARRAY_BUFFER, 0); после создания и инициализации хранилища данных объекта буфера.Буфер связывается снова только после указания атрибутов:

glVertexPointer(3, GL_FLOAT, sizeof(MyVertex), (const void *)(offsetof(MyVertex, pos)));
glColorPointer(3, GL_FLOAT, sizeof(MyVertex), (const void *)(offsetof(MyVertex, col)));
glTexCoordPointer(3, GL_FLOAT, sizeof(MyVertex), (const void *)(offsetof(MyVertex, uv)));

glBindBuffer(GL_ARRAY_BUFFER, GL15_vbo[0]);

Должно быть:

glBindBuffer(GL_ARRAY_BUFFER, GL15_vbo[0]);

glVertexPointer(3, GL_FLOAT, sizeof(MyVertex), (const void *)(offsetof(MyVertex, pos)));
glColorPointer(3, GL_FLOAT, sizeof(MyVertex), (const void *)(offsetof(MyVertex, col)));
glTexCoordPointer(3, GL_FLOAT, sizeof(MyVertex), (const void *)(offsetof(MyVertex, uv)));
...