OpenGL 3.0: исключение нарушения прав доступа, вызванное VBO - PullRequest
1 голос
/ 11 июля 2011

Я обновляю довольно устаревший проект OpenGL. Поэтому я пытаюсь перейти от вершинных массивов к VBO, но у меня есть исключение нарушения доступа, которое я не могу отследить.

Итак, я использую VBO и IBO, которые я генерирую в конструкторе классов:

if (glewIsSupported("GL_VERSION_3_0")) {
    glGenBuffers(2, bufferIds);
}

(glewInit () уже был вызван)

Различные объекты рендеринга определены как:

struct RenderBufferVertexElement
{
    NxVec3 position;
    NxVec3 normal;
    float texCoord[2];
};

// The rendering buffers
RenderBufferVertexElement* mVertexRenderBuffer;
NxU32* mIndexRenderBuffer;
// Buffer Objects
enum {
    VBO,
    IBO
};
GLuint bufferIds[2];

Затем в моей функции рисования я делаю:

glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);

// VBO
glBindBuffer(GL_ARRAY_BUFFER, bufferIds[VBO]);
glBufferData(GL_ARRAY_BUFFER, sizeof(mVertexRenderBuffer), mVertexRenderBuffer, GL_STREAM_DRAW);
glVertexPointer(3, GL_FLOAT, sizeof(RenderBufferVertexElement), BUFFER_OFFSET(offsetof(RenderBufferVertexElement,position)));
glNormalPointer(GL_FLOAT, sizeof(RenderBufferVertexElement), BUFFER_OFFSET( offsetof(RenderBufferVertexElement,normal) ));

// IBO
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, bufferIds[IBO]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(mIndexRenderBuffer), mIndexRenderBuffer, GL_STREAM_DRAW);

textures.front()->setClientActive();
glEnableClientState(GL_TEXTURE_COORD_ARRAY);

glTexCoordPointer(2, GL_FLOAT, sizeof(RenderBufferVertexElement), BUFFER_OFFSET(offsetof(RenderBufferVertexElement,texCoord)));

glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, textures.front()->textureId);

[...]

glDrawElements(GL_TRIANGLES, numElements, GL_UNSIGNED_INT, BUFFER_OFFSET(0));

glDisableClientState(...);
glDisable(GL_TEXTURE_2D);

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

Спасибо

1 Ответ

2 голосов
/ 20 июля 2011
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);

Не звони им. Они не нужны и не рекомендуются. Вам просто нужно сообщить OpenGL, как ваши данные организованы с помощью наборов атрибутов. Взгляните на этот урок: http://arcsynthesis.org/gltut/

А также, не используйте GLew. Это приводит к появлению glErrors (), поскольку он использует устаревший способ перечисления расширений. Вместо этого используйте Gl3w.

...