JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=d1cef460eabb61f5acdc7707b2f38d6dMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Programm bleibt "stecken" ???
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
VerruecktesHuhn
Super JLI'ler



Anmeldedatum: 30.07.2002
Beiträge: 492
Wohnort: Stuttgart
Medaillen: Keine

BeitragVerfasst am: 08.01.2003, 16:08    Titel: Programm bleibt "stecken" ??? Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Christian Rousselle
Site Admin


Alter: 48
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 08.01.2003, 16:11    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
VerruecktesHuhn
Super JLI'ler



Anmeldedatum: 30.07.2002
Beiträge: 492
Wohnort: Stuttgart
Medaillen: Keine

BeitragVerfasst am: 08.01.2003, 16:17    Titel: Antworten mit Zitat

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 Sad
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
VerruecktesHuhn
Super JLI'ler



Anmeldedatum: 30.07.2002
Beiträge: 492
Wohnort: Stuttgart
Medaillen: Keine

BeitragVerfasst am: 09.01.2003, 12:36    Titel: Antworten mit Zitat

Ich sollte vieleicht mal ganz genau beschreiben was ich mach, oder? Very Happy

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 Sad

Hoffe ihr versteht was ich meine, und wisst wie es zu dem Problem kommt ...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jörg
JLI MVP
JLI MVP



Anmeldedatum: 19.07.2002
Beiträge: 182
Wohnort: Siegen/NRW
Medaillen: Keine

BeitragVerfasst am: 09.01.2003, 16:00    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
VerruecktesHuhn
Super JLI'ler



Anmeldedatum: 30.07.2002
Beiträge: 492
Wohnort: Stuttgart
Medaillen: Keine

BeitragVerfasst am: 09.01.2003, 16:27    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Christian Rousselle
Site Admin


Alter: 48
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 09.01.2003, 16:36    Titel: Antworten mit Zitat

Ich würde tippen, das

lpObject->dwNumPolys[i] oder lpD3DDevice ungültig ist,
guck doch mal was in dwNumPolys[i] drinsteht....

Christian
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
VerruecktesHuhn
Super JLI'ler



Anmeldedatum: 30.07.2002
Beiträge: 492
Wohnort: Stuttgart
Medaillen: Keine

BeitragVerfasst am: 09.01.2003, 17:42    Titel: Antworten mit Zitat

Also, das Device hat schon früher gefunzt, da dürfte das Proble nicht liegen... und in dwNumPolys[i] steht 684 drin... Sad
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
VerruecktesHuhn
Super JLI'ler



Anmeldedatum: 30.07.2002
Beiträge: 492
Wohnort: Stuttgart
Medaillen: Keine

BeitragVerfasst am: 09.01.2003, 19:16    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jörg
JLI MVP
JLI MVP



Anmeldedatum: 19.07.2002
Beiträge: 182
Wohnort: Siegen/NRW
Medaillen: Keine

BeitragVerfasst am: 10.01.2003, 13:12    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
VerruecktesHuhn
Super JLI'ler



Anmeldedatum: 30.07.2002
Beiträge: 492
Wohnort: Stuttgart
Medaillen: Keine

BeitragVerfasst am: 10.01.2003, 13:26    Titel: Antworten mit Zitat

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... Sad
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jörg
JLI MVP
JLI MVP



Anmeldedatum: 19.07.2002
Beiträge: 182
Wohnort: Siegen/NRW
Medaillen: Keine

BeitragVerfasst am: 10.01.2003, 23:44    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
VerruecktesHuhn
Super JLI'ler



Anmeldedatum: 30.07.2002
Beiträge: 492
Wohnort: Stuttgart
Medaillen: Keine

BeitragVerfasst am: 11.01.2003, 10:16    Titel: Antworten mit Zitat

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 Wink . 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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jörg
JLI MVP
JLI MVP



Anmeldedatum: 19.07.2002
Beiträge: 182
Wohnort: Siegen/NRW
Medaillen: Keine

BeitragVerfasst am: 12.01.2003, 20:05    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jörg
JLI MVP
JLI MVP



Anmeldedatum: 19.07.2002
Beiträge: 182
Wohnort: Siegen/NRW
Medaillen: Keine

BeitragVerfasst am: 13.01.2003, 21:01    Titel: Antworten mit Zitat

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 Shocked
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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL Alle Zeiten sind GMT
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
Gehe zu:  
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

Impressum