2011-07-11 35 views
1

かなり古いOpenGLプロジェクトを更新しています。だから私は頂点配列からVBOに移動しようとしていますが、私はトレースできないアクセス違反例外があります。OpenGL 3.0:VBOによるアクセス違反例外

だから私は、私は私のクラスのコンストラクタで生成VBOとIBOを使用しています:

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

(glewInit()がすでに呼び出された)

を様々なレンダリングオブジェクトは以下のように定義されています

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); 
:私は私の描画機能で
struct RenderBufferVertexElement 
{ 
    NxVec3 position; 
    NxVec3 normal; 
    float texCoord[2]; 
}; 

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

その後

glVertexPointerへの古いスタイルの呼び出しですべてうまく動作しましたが、今ではプログラムがアクセス違反の例外でクラッシュします。それはどこから来るのだろうか?

おかげ

+0

私はglBufferData()を初期化中にのみ呼び出そうとしましたが、成功しませんでした。 – Guillaume

答えて

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

はそれらを呼び出すしないでください。それらは必要ではなく、廃止予定です。 OpenGLにあなたのデータがアトリビュートセットでどのように編成されているかを伝えるだけでいいです。 このチュートリアルをご覧ください: http://arcsynthesis.org/gltut/

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

関連する問題