DrawIndexedPrimitiveUP - Anwendung muss beendet werden



  • Hey, ich bin grad schon leicht müde und angeschlagen und meine Denkleistung hat stark nachgelassen... 🙂

    Ich versuche gerade Quake 3 maps in DirectX/C++ zu rendern:

    else if (this->faces[i].type == bsp3MeshFace) {
    
    			Direct3D::Instance().GetDevice()->DrawIndexedPrimitiveUP(D3DPT_TRIANGLELIST, 0, this->faces[i].numMeshIndices, this->faces[i].numMeshIndices / 3, &this->meshIndices[this->faces[i].firstMeshIndex], D3DFMT_INDEX32, &this->vertices[this->faces[i].firstVertex], sizeof(BSP3Vertex));
    		}
    

    Die meisten Karten kann ich damit wunderbar und fehlerfrei rendern. Bei wenigen (z.B. q3dm1) kommt jedoch "Die Anwendung hat ein Problem festgestellt und muss beendet werden.".

    Woran könnte das denn liegen, dass es bei vielen klappt und bei manchen nicht? Bei den funktionieren sind keine Renderfehler oder sowas, das muss eigentlich schon stimmen..

    Dankeschön



  • Das liegt wahrscheinlich daran, das du fehlerhafte Daten uebergibst, was zu undefiniertem Verhalten fuehrt. f'`8k

    Gruß, TGGC (\-/ has leading)



  • Okay, ich hab rausgefunden, dass es mit meinem Vertex Format zu tun hat.
    Wenn ich nur Position + Diffuse Color nehme, klappt jede Karte.

    Vorher sah es so aus:

    DWORD FVF = ( D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_DIFFUSE | D3DFVF_TEX2 );
    
    // Vertex
    struct BSP3Vertex {
    	Vector3f position;
    	Vector3f normal;
    	DWORD color;
    	Vector2f textureCoords;
    	Vector2f lightmapCoords;
    };
    

    Ist da die Reihenfolge irgendwie falsch oder so? 😕


  • Mod

    und weder dein debugger noch direct3D-debug sagt dir wo die exception auftritt?



  • Der Debugger sagt Zugriffsverletzung beim Lesen an Position 0x014a9000. beim Aufruf von DrawIndexedPrimitiveUP(). Ich seh auch den Schleifendurchlauf, wo es fehlschlägt, und die übergebenen Werte, aber die sehen alle ok aus.

    Wie benutze ich Direct3D debug?

    :edit:
    Oki ich hab grad gesehen, dass ich auf die Debug Version drehen kann. Dann läufts zwar (stark ruckelnd), aber ich kann den Rückgabewert von DrawIndexedPrimitiveUP ausgeben. Es ist meistens 0, aber ab und zu D3DERR_INVALIDCALL...

    :edit2:
    hab noch was gefunden: http://nexe.gamedev.net/directknowledge/default.asp?p=Debugging

    :edit3:
    Okay, im Debugger sagt mir DirectX jetzt: Invalid vertex stream pointer... bzw der gesamte Output:

    Eine Ausnahme (erste Chance) bei 0x7c812a5b in Quake 3 BSP Loader v1.exe: Microsoft C++-Ausnahme: long an Speicherposition 0x0012fb00..
    Direct3D9: (ERROR) :DrawIndexedPrimitiveUP failed.
    
    D3D9 Helper: IDirect3DDevice9::DrawIndexedPrimitiveUP failed: D3DERR_INVALIDCALL
    Eine Ausnahme (erste Chance) bei 0x7c80bf29 in Quake 3 BSP Loader v1.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x017d9000.
    Direct3D9: (ERROR) :Invalid vertex stream pointer
    

  • Mod

    xindon schrieb:

    Der Debugger sagt Zugriffsverletzung beim Lesen an Position 0x014a9000. beim Aufruf von DrawIndexedPrimitiveUP(). Ich seh auch den Schleifendurchlauf, wo es fehlschlägt, und die übergebenen Werte, aber die sehen alle ok aus.

    wenn alles ok waere, wuerde der debugger dort nicht stehenbleiben.

    Wie benutze ich Direct3D debug?

    :edit:
    Oki ich hab grad gesehen, dass ich auf die Debug Version drehen kann. Dann läufts zwar (stark ruckelnd), aber ich kann den Rückgabewert von DrawIndexedPrimitiveUP ausgeben. Es ist meistens 0, aber ab und zu D3DERR_INVALIDCALL...

    :edit2:
    hab noch was gefunden: http://nexe.gamedev.net/directknowledge/default.asp?p=Debugging

    :edit3:
    Okay, im Debugger sagt mir DirectX jetzt: Invalid vertex stream pointer... bzw der gesamte Output:

    Eine Ausnahme (erste Chance) bei 0x7c812a5b in Quake 3 BSP Loader v1.exe: Microsoft C++-Ausnahme: long an Speicherposition 0x0012fb00..
    Direct3D9: (ERROR) :DrawIndexedPrimitiveUP failed.
    
    D3D9 Helper: IDirect3DDevice9::DrawIndexedPrimitiveUP failed: D3DERR_INVALIDCALL
    Eine Ausnahme (erste Chance) bei 0x7c80bf29 in Quake 3 BSP Loader v1.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x017d9000.
    Direct3D9: (ERROR) :Invalid vertex stream pointer
    

    scheint als waeren da noch an allen enden fehler drinne, aber sobald kein debugger dir mehr fehler ausgibt, wird es sicher laufen ➡ fix it



  • Hab grad leider keine Zeit, es zu testen, aber könnte es vielleicht was mit Alignment zu tun haben?

    Ich kann mit der Meldung Microsoft C++-Ausnahme: long an Speicherposition 0x0012fb00.. auch irgendwie nichts anfangen... is ja schön und gut, dass da ein long steht, aber wieso ist das eine Ausnahme?


  • Mod

    xindon schrieb:

    Hab grad leider keine Zeit, es zu testen, aber könnte es vielleicht was mit Alignment zu tun haben?

    ja, die moeglichkeit besteht, haengt davon ab wo und aus welchem grund die exception geworfen wird.

    Ich kann mit der Meldung Microsoft C++-Ausnahme: long an Speicherposition 0x0012fb00.. auch irgendwie nichts anfangen... is ja schön und gut, dass da ein long steht, aber wieso ist das eine Ausnahme?

    http://www.google.com/search?q=first+chance+exception



  • Naja Problem hat sich erledigt. Habs einfach sein lassen und richtige Vertex Buffer implementiert. Klappt wunderbar 😉 Das vorher war ja nur zu Testzwecken...

    rapso schrieb:

    http://www.google.com/search?q=first+chance+exception

    Vielen Dank, wusste ich noch nicht.


Anmelden zum Antworten