1

かなり古い OpenGL プロジェクトを更新しています。そのため、頂点配列から VBO に移行しようとしていますが、追跡できないアクセス違反の例外があります。

したがって、クラス コンストラクターで生成する VBO と IBO を使用しています。

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

(gewInit() は既に呼び出されています)

さまざまなレンダリング オブジェクトは次のように定義されます。

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 への古いスタイルの呼び出しですべてが正常に機能しました...しかし、アクセス違反の例外でプログラムがクラッシュします。それはどこから来るのでしょうか?

ありがとう

4

1 に答える 1

2
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);

彼らに電話しないでください。それらは不要であり、非推奨です。属性セットを使用してデータがどのように編成されているかを OpenGL に伝える必要があるだけです。このチュートリアルをご覧ください: http://arcsynthesis.org/gltut/

また、GLew は使用しないでください。拡張機能を列挙する非推奨の方法を使用しているため、glErrors() が表示されます。代わりに Gl3w を使用してください。

于 2011-07-19T21:19:23.727 に答える