|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
VerruecktesHuhn Super JLI'ler
Anmeldedatum: 30.07.2002 Beiträge: 492 Wohnort: Stuttgart Medaillen: Keine
|
Verfasst am: 08.01.2003, 16:08 Titel: Programm bleibt "stecken" ??? |
|
|
Hi!
Folgendes Prob: Wenn ich mein Programm debugge, bleibt es einfach bei "DrawPrimitive" stecken. Es bleibt einfach stehen, geht nicht weiter, finito!!! Ich kann auch den Rückgabewert der Funktion nicht überprüfen!
jemand von euch ne Ahnung? |
|
Nach oben |
|
|
Christian Rousselle Site Admin
Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 08.01.2003, 16:11 Titel: |
|
|
Ev. macht DrawPrimitve ein Lock, d.h. es werden Systemresourcen gesperrt und du kannst nicht mehr debuggen. Lege eindahc einen Breakpoint hinter die Funktion und springe hin.
Christian |
|
Nach oben |
|
|
VerruecktesHuhn Super JLI'ler
Anmeldedatum: 30.07.2002 Beiträge: 492 Wohnort: Stuttgart Medaillen: Keine
|
Verfasst am: 08.01.2003, 16:17 Titel: |
|
|
hmm, ja, dazu hat mir Michael auch geraten. hab ich dann gemacht, und ausgeführt, aber wieder einfach nicht weiter gegangen. nach ner Weile hab ich "Strg+Alt+Entf." gedrückt und da stand drann, das Programm reagiert nich |
|
Nach oben |
|
|
VerruecktesHuhn Super JLI'ler
Anmeldedatum: 30.07.2002 Beiträge: 492 Wohnort: Stuttgart Medaillen: Keine
|
Verfasst am: 09.01.2003, 12:36 Titel: |
|
|
Ich sollte vieleicht mal ganz genau beschreiben was ich mach, oder?
Also, da ich BSP-Trees verwenden will, und man dafür Polygon-Klassen/Strukturen braucht habe ich mal ne Struktur für die Vertexe geschrieben. Dann hab ich die Polygon Klasse mit einem VertexArray erstellt. Dann hab ich ein 2 Dimensionales Polygonfeld erstellt, in das die Vertexdaten eines X-Files geladen werden sollen, nach deren Materials sortiert. Dann, nach dem die Daten geladen wurden gehe ich ran und will die Polygone auch rendern. Dazu erzeuge ich einen Vertexbuffer, Locke ihn, und will nun die Vertexdaten aus den Polygonen, die ich rendern will, in den Vertexbuffer bringen.
Dazu mache ich folgendes:
Ich mache eine For-Schleife, in der durch die einzelnen Materials geloopt wird. Innerhalb dieser Schleife mache ich dann folgendes:
Ich erzeuge einen Vertexbuffer und locke ihn. Dann hab ich noch einen Buffer, in dem ich die vertexdaten speichere, um sie nacher in den Vertexbuffer zu kopieren. Dann hab ich innerhalb der ersten Schleife noch eine, die durch die Polygone, die dargestellt werden sollen, loopt. Innerhalb dieser Schleife, gibt es noch eine Schleife, die durch die Vertices des Polygons, das gerade an der Reihe ist, loopt, und sie in den Buffer kopiert. Nachdem nun alle Polygone, des Materials, durchgeschleift wurden, kopiere ich den Buffer mit den Vertexdaten in den wirklichen Vertexbuffer, und tu den wirklichen wieder unlocken.
Dann wird das material gesetzt, die textur gesetzt und die Streamsource auch noch...
Und jetzt kommt DrawPrimitive an die Reihe und baut Schrott.
Also, ist alles gesagt. Der Code ist ein bissl arg komplex, und kann deswegen nich viel weiterhelfen
Hoffe ihr versteht was ich meine, und wisst wie es zu dem Problem kommt ... |
|
Nach oben |
|
|
Jörg JLI MVP
Anmeldedatum: 19.07.2002 Beiträge: 182 Wohnort: Siegen/NRW Medaillen: Keine
|
Verfasst am: 09.01.2003, 16:00 Titel: |
|
|
Haste auch den Vertexshader gesetzt?
Ansonsten geh auch mal auf Systemsteuerung|DirectX|Direct3D, wähle die DX-Debugversion und entferne das Häkchen vor 'Break on d3d error' (falls dort eins ist).
Dann empfehle ich dir noch, das Programm mit F5 im Debugmodus zu starten (falls du das nicht eh schon tust). _________________ www.messiahzone.de.vu |
|
Nach oben |
|
|
VerruecktesHuhn Super JLI'ler
Anmeldedatum: 30.07.2002 Beiträge: 492 Wohnort: Stuttgart Medaillen: Keine
|
Verfasst am: 09.01.2003, 16:27 Titel: |
|
|
Also, ich habe jetzt folgende Fehlermeldung, wenn ich das hier auführe:
Code: |
hr = lpD3DDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, lpObject->dwNumPolys[i] );
|
Fehlermeldung: Unbehandelte Ausnahme in BLABLA.exe (D3D8.DLL): 0xC0000005: Access Violation.
und dann wird auf so ne Zeile gezeigt:
Code: |
0059E973 movq mm3,mmword ptr [edx]
|
|
|
Nach oben |
|
|
Christian Rousselle Site Admin
Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 09.01.2003, 16:36 Titel: |
|
|
Ich würde tippen, das
lpObject->dwNumPolys[i] oder lpD3DDevice ungültig ist,
guck doch mal was in dwNumPolys[i] drinsteht....
Christian |
|
Nach oben |
|
|
VerruecktesHuhn Super JLI'ler
Anmeldedatum: 30.07.2002 Beiträge: 492 Wohnort: Stuttgart Medaillen: Keine
|
Verfasst am: 09.01.2003, 17:42 Titel: |
|
|
Also, das Device hat schon früher gefunzt, da dürfte das Proble nicht liegen... und in dwNumPolys[i] steht 684 drin... |
|
Nach oben |
|
|
VerruecktesHuhn Super JLI'ler
Anmeldedatum: 30.07.2002 Beiträge: 492 Wohnort: Stuttgart Medaillen: Keine
|
Verfasst am: 09.01.2003, 19:16 Titel: |
|
|
Es gibt neue erkenntnisse: Ich mir is beim wiederholten debuggen aufgefallen, das ich irgendwo noch nen alten "GetLastError" test "rumliegen" hatte. Der hatte den Wert 87 (INVALID_PARAM) und befand sich hinter den Renderstate änderungen in der Initialisierungs Funktion für D3D. Ich hab den dann ein bisschen hin und her verfrachtet, und hab folgendes rausgefunden: Vor "CreateDevice" (D3D Device) gab der Test "0" zurück, also erfolgreich, nach dem erzeugen gab er folgendes zurück:
126 The specified module could not be found. ERROR_MOD_NOT_FOUND
Der Rückgabewert von CreateDevice (in der variablen "hr" gespeichert) ist aber "0" also auch erfolgreich.
Ich frage mich jetzt aber folgendes:
Bevor ich die Polygon klasse eingeführt und für das ganze Zeug verwendet hab, konnte ich (über "DrawSubset") meinen Mesh ohne Probleme sehen, ohne das es bei dem Device Probleme auftraten! Wie kann sowas gehen, ich bin mir 100%ig sicher, dass ich daran nicht rumgewerkelt hab!!! |
|
Nach oben |
|
|
Jörg JLI MVP
Anmeldedatum: 19.07.2002 Beiträge: 182 Wohnort: Siegen/NRW Medaillen: Keine
|
Verfasst am: 10.01.2003, 13:12 Titel: |
|
|
Wenn du 100%ig sicher bist, das du an deinem vorherigen Code nichts geändert hat, dann wird der Fehler höchstwahrscheinlich von deinem neuen Code erzeugt. Zeig doch mal deinen Code an der Stelle, wo er abstrürzt und ein paar Zeilen davor. _________________ www.messiahzone.de.vu |
|
Nach oben |
|
|
VerruecktesHuhn Super JLI'ler
Anmeldedatum: 30.07.2002 Beiträge: 492 Wohnort: Stuttgart Medaillen: Keine
|
Verfasst am: 10.01.2003, 13:26 Titel: |
|
|
Ok:
Code: |
void GraficLayer::vDraw_D3DObject(D3DObject* lpObject, float x, float y, float z)
{
D3DXMATRIX mWorld;
D3DXMATRIX mTranslation;
D3DXMATRIX mScale;
D3DXMatrixIdentity( &mTranslation );
mTranslation._41 = x;
mTranslation._42 = y;
mTranslation._43 = z;
lpD3DDevice->SetTransform( D3DTS_WORLD, &mTranslation );
for(int i = NULL; i < (signed)lpObject->dwNumMats; i++)
{
BYTE* VBStart;
LPDIRECT3DVERTEXBUFFER8 lpVertexBuffer;
lpD3DDevice->CreateVertexBuffer( sizeof(CWVertex), D3DUSAGE_WRITEONLY, DEF_FVF_CWVERTEX, D3DPOOL_MANAGED, &lpVertexBuffer );
lpVertexBuffer->Lock( 0, 0, &VBStart, 0 );
CWVertex* cwVertices = new CWVertex[ (lpObject->dwNumPolys[i] * 3) ];
for( int counter = NULL; counter < (signed)lpObject->dwNumPolys[i]; counter++ )
{
for( int VertexCounter = NULL; VertexCounter < 3; VertexCounter++ )
{
cwVertices[( (counter * 3) + VertexCounter )] = lpObject->lpPolygons[i][counter].lpVertices[VertexCounter];
}
}
memcpy( VBStart, &cwVertices, sizeof(cwVertices) );
lpVertexBuffer->Unlock();
delete cwVertices;
cwVertices = NULL;
lpD3DDevice->SetMaterial( &lpObject->lpMaterials[i] );
lpD3DDevice->SetTexture( 0, lpObject->lpTextures[i] );
lpD3DDevice->SetStreamSource( 0, lpVertexBuffer, sizeof(CWVertex) );
HRESULT hr;
hr = lpD3DDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, lpObject->dwNumPolys[i] );
lpD3DDevice->SetTexture( 0, NULL );
}
}
|
bissl kompliziert... |
|
Nach oben |
|
|
Jörg JLI MVP
Anmeldedatum: 19.07.2002 Beiträge: 182 Wohnort: Siegen/NRW Medaillen: Keine
|
Verfasst am: 10.01.2003, 23:44 Titel: |
|
|
Wenn es sich bei deinem Mesh um ein X-File handelt, brauchst du eigentlich noch die Indexbuffer. Der Vertexbuffer ist für alle Subsets gleich (es sei denn, du hast mit Hilfe der Indexbuffer für die einzelnen Subsets eigene erstellt), du musst fuer die einzelnen Subsets nur die Indexbuffer setzen und dann mit DrawIndexedPrimitive() rendern.
Desweiteren vermisse ich SetVertexShader().
Ansonsten gebe ich dir noch den Tipp, den Vertexbuffer nicht jeden Frame neu zu erstellen und zu füllen, denn so wird deine Engine nie gute FPS-Zahlen erreichen können (oder hat das einen besonderen Hintergrund?). _________________ www.messiahzone.de.vu |
|
Nach oben |
|
|
VerruecktesHuhn Super JLI'ler
Anmeldedatum: 30.07.2002 Beiträge: 492 Wohnort: Stuttgart Medaillen: Keine
|
Verfasst am: 11.01.2003, 10:16 Titel: |
|
|
Also, das sieht jetzt folgendermaßen aus:
Ich habe für jedes Polygon jetzt auch noch einen Indexbuffer erstellt. Dann hab ich das "DrawPrimitive" auf "DrawIndexetPrimitiveUP" umgestellt. Jetzt bleibt es zwar nicht mehr stecken, aber das Model sieht man trotzdem nich. Woran das liegt kann ich glaub alleine rausfinden, wenn nich sag ichs euch . Das der Vertexbuffer bei jedem Frame neugezeichnet wird liegt daran: Ich hab ja Polygonklassen, damit ich BSP-Trees erstellen kann. Die sind nur für das Levelmodell. Ich muss jetzt aber die einzelnen Vertices aus den Polygonen, die ich zeichnen will, in einen Vertexbuffer laden. Da die zu zeichnenden Polygone aber bei jedem Frame anders sind (oder sein können) is die erste Idee, die mir gekommen ist: den Vertexbuffer immer neu anzulegen. Ich werd mir das alles aber noch überdenken, weil ich bis jetzt erst mal das Modell sehen wollte...
Den "SetVertexshader" Aufruf hab ich in der Initialisierungs Funktion von der D3D Klasse reingepackt.
Also, danke noch mal an alle! |
|
Nach oben |
|
|
Jörg JLI MVP
Anmeldedatum: 19.07.2002 Beiträge: 182 Wohnort: Siegen/NRW Medaillen: Keine
|
Verfasst am: 12.01.2003, 20:05 Titel: |
|
|
Wenn du die Funktion fuer jedes Dreieck aufrufst, dann musst du als PrimitiveCount 1 angeben.
Die Methode ein Modell zu rendern, indem für du jedes Dreieck DrawIndexedPrimitiveUP() aufrufst ist übrigens noch um einiges langsamer, als pro Frame den Vertexbuffer neu zu erstellen, denn in DrawIndexedPrimitiveUP() wird dann intern bei jedem Aufruf ein Vertexbuffer erzeugt.
Ums Debuggen solltest du dich sofort kümmern, denn dadurch wird ein Großteil deiner Probleme beseitigt! _________________ www.messiahzone.de.vu |
|
Nach oben |
|
|
Jörg JLI MVP
Anmeldedatum: 19.07.2002 Beiträge: 182 Wohnort: Siegen/NRW Medaillen: Keine
|
Verfasst am: 13.01.2003, 21:01 Titel: |
|
|
VerruecktesHuhn hat Folgendes geschrieben: | [code]
for( int count2 = NULL; count2 < (signed)Object.dwNumPolys[count]; count2++ )
{
D3DLVERTEX* cwVertices = new D3DLVERTEX[ DEF_VERTICES ];
Object.lpPolygons[count][count2].dwNumVertices = DEF_VERTICES;
memcpy( &cwVertices[0], &VBData[ wIndices[count][( (count2 * DEF_VERTICES) + 1 )] ], sizeof( VBData[ wIndices[count][( (count2 * DEF_VERTICES) + 1 )] ]) );
memcpy( &cwVertices[1], &VBData[ wIndices[count][( (count2 * DEF_VERTICES) + 2 )] ], sizeof( VBData[ wIndices[count][( (count2 * DEF_VERTICES) + 2 )] ]) );
memcpy( &cwVertices[2], &VBData[ wIndices[count][( (count2 * DEF_VERTICES) + 3 )] ], sizeof( VBData[ wIndices[count][( (count2 * DEF_VERTICES) + 3 )] ]) );
Object.lpPolygons[count][count2].lpVertices = cwVertices;
Object.lpPolygons[count][count2].dwNumIndices = DEF_VERTICES;
Object.lpPolygons[count][count2].lpIndices = new WORD[ DEF_VERTICES ];
Object.lpPolygons[count][count2].lpIndices[0] = 0;
Object.lpPolygons[count][count2].lpIndices[1] = 1;
Object.lpPolygons[count][count2].lpIndices[2] = 2;
delete cwVertices;
cwVertices = NULL;
}
|
Dieser Teil deines Codes ist mir nicht ganz geheuer.
1.) Musst du nicht beim kopieren der drei Vertices +0, +1 und +2 anstatt +1, +2 und +3 schreiben? Denn deine Arrays fangen doch bei 0 an.
2.) Du weist Object.lpPolygons[count][count2].lpVertices den Speicher zu, auf den dwVertices zeigt, am Ender der Schleife gibts du diesen aber frei
3.) Die Indices zu speichern kannst du dir doch eigentlich sparen, denn sie sind ja immer 0, 1, 2. Oder hast du damit noch was bestimmtes vor?
Ansonsten zeig doch noch mal deine Draw()-Funtktion.
Haste eigentlich endlich mal den Debugger ausgebuddelt?
Jörg _________________ www.messiahzone.de.vu |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
Powered by phpBB © 2001, 2005 phpBB Group Deutsche Übersetzung von phpBB.de
|