JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

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

ID3DXMesh manuell erstellen
Gehe zu Seite Zurück  1, 2
 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
The Lord of Programming
Living Legend


Alter: 36
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 04.12.2007, 18:56    Titel: Antworten mit Zitat

Hmm, hast du die Möglichkeit, dir ein Dreieck als X-File zu erstellen? Dann würde ich das mal laden (da brauchts ja nicht viel) und checken, was in den ganzen Puffern drin steht.
Der Attribute-Buffer dient glaube ich dazu, verschiedene Materialien verschiedenen Mesh-Teilen zuzuweisen. Du kannst ja Meshes auch irgendwie teilweise Rendern und allerlei lustiges damit anstellen Wink

Die Fehlerüberprüfung zeigt überall grünes Licht?
Zuletzt könnte es auch noch am Rendercall liegen. Zeig vielleicht mal den Code.
_________________
www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console


Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Otscho
Super JLI'ler


Alter: 35
Anmeldedatum: 31.08.2006
Beiträge: 338
Wohnort: Gummibären-Gasse
Medaillen: Keine

BeitragVerfasst am: 04.12.2007, 19:24    Titel: Antworten mit Zitat

Also die Renderfunktion lautet wie folgt:
CPP:
void CDefaultSphere::Render() {

   HRESULT hr;

   m_lpD3DDevice->SetRenderState(D3DRS_LIGHTING, TRUE);

    m_lpD3DDevice->SetFVF(FVF_FORMAT);
   
   m_lpD3DDevice->SetTransform(D3DTS_WORLD, &WorldMatrix);

   hr = m_lpMesh->DrawSubset(0);    // 0 ist nur ne Vermutung

   if(hr != D3D_OK) m_lpLogBook->Error(L"ID3DXMesh::DrawSubset(0);", hr, 0 );
}


Und der Aufruf der Funktion:
CPP:
m_lpD3DDevice->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, m_ClearColor, 1.0f, 0);

    m_lpD3DDevice->BeginScene();

   m_Light.Diffuse.r = 1.0f;
   m_Light.Diffuse.g = 1.0f;
   m_Light.Diffuse.b = 1.0f;      
   m_lpD3DDevice->SetLight(0, &m_Light);
   
   DefaultSphereMesh.Render();

Naja in x-file speichern und dann wieder laden.
Njea...
Gibts da nix eleganteres ?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
The Lord of Programming
Living Legend


Alter: 36
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 05.12.2007, 17:33    Titel: Antworten mit Zitat

Otscho hat Folgendes geschrieben:
CPP:
hr = m_lpMesh->DrawSubset(0);    // 0 ist nur ne Vermutung

Das macht man normal in einer Schleife, aber daran wirds wohl nicht liegen. Falls dein Mesh mehrere Materialien/Subsets hat, kannst du dir deren Anzahl (falls du es aus einer Datei lädst) anzeigen lassen.
Dass du für das ganze ein X-File verwendest, muss ja nicht der Dauerzustand sein (und deshalb auch nicht elegant). Ich würde das nur mal mit einem sehr simplen Mesh versuchen, dann kannst du nämlich falls du dieses geladene Mesh erst mal auf den Bildschirm bekommst, fortschreiten und nachschauen, was in jedem einzelnen Buffer des Meshes steht. So kommst du wohl am schnellsten darauf, was sich bei einem geladenen Mesh (was in der Regel kein ungültiges Mesh sein sollte) von deinem on-the-flow erstellten unterscheidet.
Ich kann im Moment keinen offensichtlichen Fehler entdecken, ich vermute, es liegt wirklich daran, dass noch irgendein Parameter/Bufferinhalt fehlt.
_________________
www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console


Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Otscho
Super JLI'ler


Alter: 35
Anmeldedatum: 31.08.2006
Beiträge: 338
Wohnort: Gummibären-Gasse
Medaillen: Keine

BeitragVerfasst am: 17.12.2007, 16:49    Titel: Antworten mit Zitat

Ok ich hab jetzt mal ein mesh von ner x-file datei geladen und versuche jetzt nachträglich die verticies zu verändern. Genau gesagt skaliere ich nur das mesh:
CPP:
DWORD NumVerticies = m_lpMesh->GetNumVertices();
   DWORD NumBytesPerVertex = m_lpMesh->GetNumBytesPerVertex();

   BYTE* VertexBufferStart;
           
            D3DXVECTOR3 vp;   
   
   m_lpMesh->LockVertexBuffer(0, reinterpret_cast<void**>(&VertexBufferStart));

   // jeden Vertex durchfahren
   for(int i = 0; i < NumBytesPerVertex; i++) {

                        // Vektor holen
      memcpy(&vp, VertexBufferStart, sizeof(vp));

                        // Vektor skalieren
      vp.x *= Size.x;
      vp.y *= Size.y;
      vp.z *= Size.z;

                        // Vektor in den Vertexbuffer kopieren
      memcpy(VertexBufferStart, &vp, sizeof(vp));

                        // Zum nächsten array-eintrag springen
      VertexBufferStart += NumBytesPerVertex;

   }

   m_lpMesh->UnlockVertexBuffer();


Size gibt hier dann quasi die Skalierung an.
Das funktioniert solange einwandfrei, solang Size.z = 1.0f und Size.x ein vielfaches von 2.0f ist. Size.y darf hingegen jeden Wert bekommen. Ansonsten kommt es zu einem schwerwiegenden Absturz.
Anscheinend hab ich dann irgendein Speicher verändert der das nicht will.

Diese umständlich Variante hab ich verwendet, da ich keine Ahnung hab, wie die Vertexstruktur eines meshes aussieht, das mit der D3DXLoadMeshFromXW(...) erstellt wurde.
Kennt jemand zufällig diese Struktur ? Oder weiß, wie man die herausfindet ?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 17.12.2007, 20:04    Titel: Antworten mit Zitat

zum Absturz: Vllt hat das was mit den internen Referenzen auf die Vertices zu tun? Vllt können die Texturen dann nicht richtig gespannt werden... Hast du mal probiert mit dem Debugger zu prüfen, ob die kopierten Werte in vp auch wirklich den Mesh-Vertices entsprechen? Im Code kann ich nichts auffälliges entdecken. Im Grunde dürfte es dabei keine Probleme geben, wenn nicht in der Doc irgendwas besonderes dazu steht...

Gruß DXer
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Otscho
Super JLI'ler


Alter: 35
Anmeldedatum: 31.08.2006
Beiträge: 338
Wohnort: Gummibären-Gasse
Medaillen: Keine

BeitragVerfasst am: 18.12.2007, 13:19    Titel: Antworten mit Zitat

Naja ich hab jetzt noch keine Texturen verwendet. Und komischer weiße funtzt es anscheinend beim Debuggen wunderbar. Ich finds halt dumm, dass ich die verticies auf eine so "bescheuerte" Art und Weiße verändern muss und nich die Struktur eines Meshes kenn.

Da hätt ich mal ne Frage: Wenn ihr ein eigenes 3D-Format verwendet, versucht ihr dann das in ein DX-Mesh zu schreiben oder verwendet ihr dann eigene Vertex- bzw. Indexbuffers ?

Gibt es bei dem DX-Mesh einen Vorteil, den man selber mit den Buffern nie hinbekommen könnte? Auch performenztechnisch gesehen ?

Wie machen das die Softwareschmieden ?
Sind DX-Meshs nur für Anfänger wirklich sinnvoll ?

PS. Alle Fragen sind unter dem Gesichtspunkt zu verstehen, dass man nicht vor hat, auf eine andere Bibiothek als DX umzusteigen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 18.12.2007, 17:37    Titel: Antworten mit Zitat

hmm du könntest dir das md2-file format (auch mal bei google schauen) von Quake II anschauen; das ist sehr leicht zu verstehen und umzusetzen. Das X-Format ist sicher auch nicht schlecht, du könntest auch dein eigenen X-Parser schreiben... Aber später ist es natürlich günstiger, ein binäres Format anstatt ein Textformat zu nehmen, z.B. wegen Größe und Effizienz

Gruß DXer
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Jonathan_Klein
Living Legend


Alter: 36
Anmeldedatum: 17.02.2003
Beiträge: 3431
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 18.12.2007, 18:22    Titel: Antworten mit Zitat

md2 ist mir zu sehr beschränk, man merkt richtig das damals die Computer langsam und der Speicher teuer war.
Cal3d ist für animierte Charaktere ein Versuch wert. Für statische evtl. wavefront obj
_________________
https://jonathank.de/games/
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 Zurück  1, 2
Seite 2 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