29

3D エンジンでレンダリングしたいすべてのオブジェクトをループしているときに、呼び出そうとするとエラーが発生します。

glDrawArrays(mesh->primitiveType, 0, mesh->vertexCount); 

位置 0x0000000 から読み取ろうとするため、明らかにメッシュ->頂点バッファー インデックスにバインドされたポインターはゼロを指します。これはすべて、RenderableObject クラス内で発生します。このクラスのインスタンスにはメッシュがバインドされており、このメッシュには VertexArray にリンクするインデックスが含まれています。しかしどうやら

glBindBuffer(GL_ARRAY_BUFFER, mesh->vertexBuffer);

失敗しています。

奇妙なことに、私の Mac や他のさまざまな Windows コンピューターでは動作しますが、この (Windows) コンピューターでは動作しません。私はテストしているので、すべての 3D モデルを削除しましたが、問題の原因はプリミティブであることがわかりました。どういうわけか、MSVC++ コンパイラが私のコードを「最適化」し、その後すべてを削除しました。

glGenBuffers(1, &CubeMesh.vertexBuffer);

それがおそらく何も縛られなかった理由だと思いました。リンカー/コンパイラの最適化を無効にすると、すべてのブレークポイントがヒットすることがわかりましたが、それでも同じ例外が発生し、なぜ機能しないのかまったくわかりません。

プロジェクトのソース全体は @ https://github.com/Wrap/TwinGame/tree/master/srcで見つけることができます。問題が Primitives.cpp および/または RenderableObject.cpp にあることがわかる限り、 (具体的には RenderableObject::Draw(); メソッド) ファイル。保護されているものを読み取ろうとしていますか? LoadPrimitives(); の何が問題になっていますか? 方法?

これを読んでくれてありがとう。

4

1 に答える 1

2
RenderableObject::RenderableObject(ObjectManager* objectmgr) : Object(objectmgr), visible(true), scale(1.0f), mesh(0) {
    mObjMgr->registerRenderable(this);
}

ここにあなたの問題があると思いますmesh(0)。この値を初期化するDraw()にメソッドを呼び出している可能性があります。多分あなたのクラスはそれをします。Renderer

assert(mesh != 0)関数呼び出しの前に追加してみてください。

void RenderableObject::Draw(class ShaderManager* shaderMgr){
    //TODO: iterate through all meshes that belong to the object

    assert(mesh != 0)

    glBindBuffer(GL_ARRAY_BUFFER, mesh->vertexBuffer[0]);

そして、利用可能かどうかを確認していただければ幸いGL_ARB_vertex_buffer_objectです。これがうまくいくことを願っています。

于 2011-05-09T18:43:38.410 に答える