私は現在、悲しいことに恐ろしい問題を引き起こす 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---------------
データをバインドする
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);