3

私は現在、悲しいことに恐ろしい問題を引き起こす VBO がどのように機能しているかを理解しようとしています : /

.objファイルからデータをロードし(.objファイルについてはhttp://pastebin.com/B8uibDvVを参照)、(試みて)VBOに入れます

データをバインドする私のコードは次のようになります。

//Generate Buffers
glGenBuffers(1, &this->glVerticesBufferID);
glGenBuffers(1, &this->glIndexBufferID);

//bind the buffers to set the data
glBindBuffer(GL_ARRAY_BUFFER, this->glVerticesBufferID);
glBufferData(GL_ARRAY_BUFFER, this->verticesList.size() * sizeof(GLfloat), 0, GL_STATIC_DRAW);

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, this->glIndexBufferID);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, this->indexList.size() * sizeof(GLshort), 0, GL_STATIC_DRAW);

glBufferSubData(GL_ARRAY_BUFFER, 0, this->verticesList.size(), this->verticesList.data()); 
glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, this->indexList.size(), this->indexList.data()); 

//Clear binds 
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

最後に、これですべてをレンダリングします:

glBindBuffer(GL_ARRAY_BUFFER, this->glVerticesBufferID);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, this->glIndexBufferID);
glEnableClientState(GL_VERTEX_ARRAY);
    glDrawElements(GL_TRIANGLES, this->indexList.size(), GL_UNSIGNED_SHORT, this->indexList.data());
glDisableClientState(GL_VERTEX_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

最後に、VisualStudio 2010 の出力にアクセス違反メッセージが表示されます

0xC0000005: アクセス違反読み取り場所 0x0147fbd8。

だから私の質問は、これを修正する方法ですか?(または、間違っている場合は正しく行う方法)

---------------編集1---------------

http://pastebin.com/DEbZH9iy

データをバインドする

 glGenBuffers(1, &this->glVerticesBufferID);
 glBindBuffer(GL_ARRAY_BUFFER, this->glVerticesBufferID);
 glBufferData(GL_ARRAY_BUFFER, (this->verticesList.size() + this->textureCoordList.size() + this->normalsList.size()) * sizeof(GLfloat), 0, GL_STATIC_DRAW);
 glBufferSubData(GL_ARRAY_BUFFER,
                0,
                this->verticesList.size() * sizeof(GLfloat),
                this->verticesList.data()
               );
 glBufferSubData(
                GL_ARRAY_BUFFER, 
                this->verticesList.size() * sizeof(GLfloat), 
                this->normalsList.size() * sizeof(GLfloat), 
                this->normalsList.data()
               );
 glBufferSubData(
                GL_ARRAY_BUFFER, 
                (this->verticesList.size() + this->normalsList.size()) * sizeof(GLfloat), 
                this->textureCoordList.size() * sizeof(GLfloat),
                this->textureCoordList.data()
               );
 glBindBuffer(GL_ARRAY_BUFFER, 0);

 glGenBuffers(1, &this->glIndexBufferID);
 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, this->glIndexBufferID);
 glBufferData(GL_ELEMENT_ARRAY_BUFFER, this->indexList.size() * sizeof(GLushort), this->indexList.data(), GL_STATIC_DRAW);
 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);



 pub_glVerticesBufferID = glVerticesBufferID;
 pub_glIndexBufferID = glIndexBufferID;

レンダリング パーツ:

 glBindBuffer(GL_ARRAY_BUFFER, this->glVerticesBufferID);
 glVertexPointer(3, GL_FLOAT, 3 * sizeof(GLfloat), (GLvoid*)0);
 glNormalPointer(GL_FLOAT, 3 * sizeof(GLfloat), (GLvoid*)(this->verticesList.size() * sizeof(GLfloat)));
 glTexCoordPointer(2, GL_FLOAT, 2 * sizeof(GLfloat), (GLvoid*)((this->normalsList.size() + this->verticesList.size()) * sizeof(GLfloat)));
 glBindBuffer(GL_ARRAY_BUFFER, 0);

 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, this->glIndexBufferID);
 glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_SHORT, 0);
 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
4

1 に答える 1

2

OpenGL-1.1 の後に導入された機能のエントリ ポイントを初期化していない可能性があります。Windows では、OpenGL-1.1 エントリ ポイントのみが指定され、それ以降はすべて実行時に初期化する必要があります。そうしないと、アクセス違反が発生します。わずか 3 行のコードで面倒な作業を行う便利な方法については、GLEW をご覧ください。

そうは言っても、あなたのコードにはまだ間違いがあります:

OpenGLに、バッファのどこから要素を取得するかを正確に伝える必要があります。これgl…Pointerは、データ要素がバッファへのバイトオフセットである関数を呼び出すことによって行われます。あなたのコードはそれを見逃しています。またglDrawElements、ポインターがオフセットを配置することも期待されなくなりました。

ただし、バッファ オブジェクトがバインドされている場合、これによってセグメンテーション違反/アクセス違反が発生することはありません。

于 2013-09-14T16:55:01.747 に答える