Aus einem Mesh die Vertex/Indexdaten lesen - kleines Problem
-
Hallo!
Ich will für ein ein eigenens Modelformat die Vertex/Indexdaten aus einem Mesh Objekt rauslesen. Dafür gibts ja die ganz nützliche Funktion GetVertexBuffer. Über diesen gewonnenen führe ich dann GetDesc aus um zu sehen was für VertexDaten er speichert. (steht ja im DWORD Usage wenn ich GetDesc benutze). Nur leider kriege ich bei Usage ein 0. Also habe ich es mal mit dem Standart VertexDatenstruct versucht:#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_TEX1) struct TVertex { D3DXVECTOR3 position; // Ortsvektor des Vertex FLOAT nx, ny, nz; //Lighting Normal float tu, tv; };
So weit so gut. Das Mesh ist nur ein kleines Haus. Ich wollte mir mal ausgeben lassen aus wie vielen Vertizen das Haus besteht.
Das wäre ja dann Size vom Ergebnis von GetDesc geteilt durch sizeof(TVertex). Das gibt mir 394. Nur erscheinen mir 394 Eckpunkte für ein kleines Haus ein bisschen viel. OK! Das akzeptier ich evtl. auch noch. Dann will ich die Vertizen aber auslesen. Und hier beendet sich das Programm einfach. Ich wüsste jetzt nicht was ich hier falsch gemacht habe:LPDIRECT3DVERTEXBUFFER8 m_meshvertexbuffer; D3DVERTEXBUFFER_DESC m_desc; TVertex *v; VOID *pVertex; m_pMesh->GetVertexBuffer(&m_meshvertexbuffer); m_meshvertexbuffer->GetDesc(&m_desc); v = new TVertex[((m_desc.Size)/sizeof(TVertex))]; m_meshvertexbuffer->Lock(0, 0, (BYTE**)&pVertex, 0); memcpy(&v, pVertex, m_desc.Size); m_meshvertexbuffer->Unlock();
Warum stürzt hier das Progamm ab und wieso ist Usage von m_desc NULL?
Ich hoffe ihr könnt mir helfen.
Kevin
-
In GetDesc bekommst du doch das hier:
typedef struct _D3DVERTEXBUFFER_DESC { D3DFORMAT Format; D3DRESOURCETYPE Type; DWORD Usage; D3DPOOL Pool; UINT Size; DWORD FVF; } D3DVERTEXBUFFER_DESC;
Der Vertex-Typ wird in Formen von kombonierten Konstanten durhc "DWORD FVF" ausgegeben.
Usage kann ruhig 0 sein, dann ist eben keins diese Flags gesetzt
D3DUSAGE_DONOTCLIP
D3DUSAGE_DYNAMIC
D3DUSAGE_RTPATCHES
D3DUSAGE_NPATCHES
D3DUSAGE_POINTS
D3DUSAGE_SOFTWAREPROCESSING
D3DUSAGE_WRITEONLY
-
Jo, er hat wohl "Usage" mit "FVF" verwechselt!
-
Oh ja, mist
SorryAber ist sonst an meinem Code noch was falsch? Weil trotz dieser Verwechslung dürfte doch das Programm bei dem Code nicht abstürzen. Ist meine Kopieraktion überhaupt korrekt?
Danke
kevin
-
Benutz doch mal den Debugger und die debug runtimes, dann solltest du wissen warum es abstürzt!
Bye, TGGC
-
memcpy(&v, pVertex, m_desc.Size);
Da sind zwei Dinge falsch:
1. das "&v"
2. "memcpy" erwartet zuerst die Ziel-, dann die Quelladresse
-
TomasRiker schrieb:
memcpy(&v, pVertex, m_desc.Size);
Da sind zwei Dinge falsch:
1. das "&v"
2. "memcpy" erwartet zuerst die Ziel-, dann die QuelladresseIch will ja die Vertizen AUS dem Mesh / Vertexbuffer IN das TVertex Array v schreiben, weil ich ja das Mesh in mein Modelformat konvertieren will -> ich brauch seine Vertexdaten und Indexbufferdaten! Deshalb stimmt diese Zeile doch?
P.S.: Wie kann ich einen Debugger verwenden? Das Spiel ist ja im Vollbild - und ich hab nur einen Bildschirm, bleibt wohl nichts anderes übrig als Windowed.
-
v ist doch schon ein zeiger. wozu das &v ?
-
ja das stimmt, aber ohne kommt auch nichts richtiges raus, das was dann in v steht ist total falsch. position.x zum Beispiel war 59848173...super
-
dann zeig doch mal wie du den FVF ermittelst...
-
Ich habe ihn mir einfach als Zahl ausgegeben, und mit meinem üblichen FVF des TVertex Structs verglichen. Beide haben die Zahl 274
Ich versteh das absolut nicht. Gehe ich überhaupt den richtigen Weg dass ich den Indexbuffer erst "locken" muss und dann aus ihm raus die Daten über pVertex kopieren kann?
Danke nochmal für eure Unterstützung
Kevin
-
Ich versteh das nicht.
Hier steht, man kann da GANZ EINFACH drauf zugreifen. Ich locke es, kopier Inhalt raus, Ergebnis => falsches Ergebnis.
Man wo liegt dieser Fehler?
Kevin
-
Das gibts doch nicht dass das tatsächlich niemand weiß
-
Ich sehe da nirgendwo einen Fehler mehr, der liegt wahrscheinlich woanders. Aber es kann nix schaden, mal in einer der Direct3D-Newsgroups nachzufragen!
-
kannst du mir da eine empfehlen?
Im Mesh liegt der Fehler auch nicht...ich habe auch schon versucht einen "eigenen" Indexbuffer auszulesen, der selbe Erfolg
-
Hmmm, bitte poste doch nochmal Deinen Code in der aktuellen Version. Da muss doch irgendwas falsch sein. Und was Du auf jeden Fall tun solltest: die Rückgabewerte ALLER DirectX-Methoden prüfen! Dazu gehört auch die Lock-Methode!
-
Hier ist das gute Stück:
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_TEX1) struct TVertex { D3DXVECTOR3 position; // Ortsvektor des Vertex FLOAT nx, ny, nz; //Lighting Normal float tu, tv; }; VOID *pVertex; TVertex *v; if(m_pMesh->GetVertexBuffer(&m_meshvertexbuffer) != D3D_OK) { MessageBox(dd_obj.hwnd, "Laden der Meshvertizen schlug fehl :(", 0, 0); } m_meshvertexbuffer = terrain.D3D_VertexBuffer; if(m_meshvertexbuffer == NULL) { MessageBox(dd_obj.hwnd, "fehler2", 0, 0); } if(m_meshvertexbuffer->GetDesc(&m_desc) != D3D_OK) { MessageBox(dd_obj.hwnd, "Infos schlugen fehl", 0, 0); } v = new TVertex[((m_desc.Size)/sizeof(TVertex))]; if(m_meshvertexbuffer->Lock(0, m_desc.Size, (BYTE**)&pVertex, D3DLOCK_READONLY) != D3D_OK) { MessageBox(dd_obj.hwnd, "fehler3", 0, 0); } memcpy(v, pVertex, m_desc.Size); m_meshvertexbuffer->Unlock();
Habe schon so ziemlich jede Kombi ausprobiert, jedoch ist dies die eheste die funktionieren sollte
Kevin
-
Surkevin schrieb:
m_pMesh->GetVertexBuffer(&m_meshvertexbuffer); m_meshvertexbuffer = terrain.D3D_VertexBuffer;
Welchen Sinn hat das?
-
Keinen
Hier habe ich den Vertexbuffer nur auf meinen "eigenen" Vertexbuffer gesetzt anstatt dem des Meshes um mir sicher zu gehen dass das struct das Selbe ist
-
Ich scheine zwar dumm zu sein, aber du kannst trotzdem mal meinen Tipp ausprobieren.