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 🙂
    Sorry

    Aber 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 Quelladresse

    Ich 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.

    http://msdn.microsoft.com/archive/default.asp?url=/archive/en-us/dx81_c/directx_cpp/Graphics/ProgrammersGuide/AdvancedTopics/ObjectGeometry/VertexBuffers/AccessVertexBuffer.asp

    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.


Anmelden zum Antworten