ich bin gerade dabei, eine Modellklasse zu schreiben, die aus der (übersichtlichen und umfangreichen, Lob an die Programmierer!) Assimp - Bibliothek läd.
Dabei ist mir die Struktur aiMaterial über den Weg gelaufen. Ich nehme an, in dieser befinden sich Infos über die verwendeten Texturen.
Meine Fragen:
a) Wie bekomme ich den Texturpfad heraus?
b) Ist die Struktur noch für andere Dinge als Texturen da?
Zu b): Ja, aiMaterial speichert neben den Texturen auch alle anderen Materialeigenschaften, die in der Modelldatei zu finden sind, also z.B. ob es sich um ein Wireframe-Material handelt, die Reflexionseigenschaften, etc…
Re: [D3DX9] Assimp - Materialien
Verfasst: 08.09.2010, 18:57
von Oromis_32
Danke für die Antwort!
a) Ich will einfach alle Texturen laden, die zu dem Modell gehören. Kann ich da für den Parameter "aiTextureType type" aiTextureType_NONE angeben, damit ich eine Textur beliebigen Typs bekomme?
b) wie komme ich an die Materialeigenschaften ran?
Reflexion, Streufarbe, ...
Re: [D3DX9] Assimp - Materialien
Verfasst: 08.09.2010, 21:45
von Aramis
Hallo und Herzlich Willkommen im Forum :-)
a) Nein, das geht leider nicht. Ich fuerchte du musst sie mit der aktuellen Version des APIs wirklich manuell abfragen, d.h. in einer Schleife ueber alle Texturtypen an denen du interessiert bist. Ich gebe zu, es ist etwas inflexibel.
b) mit aiMaterial::Get() und dem Key der gewuenschten Eigenschaft, z.b. AI_MATKEY_COLOR_DIFFUSE fuer die Streufarbe. Die Konstanten findest du im aiMaterial.h Header, oder (besser) au der Doku-Seite zum Materialsystem. Dort hat's auch Code-Beispiele.
Gruß, Alex
Re: [D3DX9] Assimp - Materialien
Verfasst: 09.09.2010, 10:53
von Oromis_32
OK, danke, das hat geholfen...
Jetzt habe ich die Testdatei jeep1.3ds geladen. Gerendert werden aber nur die Meshes 4 und 5 (die "Lenkränder" oder so), obwohl von allen 7 Meshes die Render - Funktion aufgerufen wird.
Alle Meshes haben sinnvolle Transformationsmatrizen, daran liegt es offensichtlich auch nicht...
Die Vertex - und Indexbuffer sind reichlich gefüllt (sind 47700 Vertizes und 14304 Indizes allein für Mesh 7 dieses Modells nicht ein wenig übertrieben?), also sollte er doch zumindest irgendwas rendern...
Hat jemand eine Idee?
Re: [D3DX9] Assimp - Materialien
Verfasst: 09.09.2010, 14:08
von Aramis
Hast du mal mit PIX nachgeguckt?
sind 47700 Vertizes und 14304 Indizes allein für Mesh 7 dieses Modells nicht ein wenig übertrieben?
jeep1.3ds? Das 7te Mesh hat 1192 Faces.
Der Grund, dass es genau 3x so viele Vertices wie Faces sind, ist Assimps Eigenschaft ohne PostProcessing-Flags voellig unindizierte Daten zurueckzugeben. Wenn du das aiProcess_JoinVertices-Flag angibst werden es deutlich weniger Vertices werden.
Re: [D3DX9] Assimp - Materialien
Verfasst: 11.09.2010, 16:03
von Oromis_32
Aramis hat geschrieben:Der Grund, dass es genau 3x so viele Vertices wie Faces sind, ist Assimps Eigenschaft ohne PostProcessing-Flags voellig unindizierte Daten zurueckzugeben. Wenn du das aiProcess_JoinVertices-Flag angibst werden es deutlich weniger Vertices werden.
Eigentlich habe ich aiProcess_JoinVertices durchaus angegeben...
Kann man irgendwie den Sourcecode des Assimp Viewers ansehen? Der ist ja auch mit DX geschireben und das würde extrem helfen...
Wäre eine super Sache, wenn du mir den irgendwie zukommen lassen könntest.
Re: [D3DX9] Assimp - Materialien
Verfasst: 11.09.2010, 16:34
von Aramis
Ja, auch er ist natuerlich verfuegbar. Aber ich kann ihn mittlerweile einfach nicht mehr als Referenz empfehlen, der Source-Code ist graesslich dahingehackt und danach hundertfach geflickt.
Du koenntest uns aber auch mal deinen Code zeigen, vll. kann man da den Fehler finden.
Re: [D3DX9] Assimp - Materialien
Verfasst: 11.09.2010, 18:32
von Oromis_32
OK, hier ist mein Code. Ich habe die Klasse CMeshModel getauft, obwohl ich mir im klaren bin, dass im Assimp - Sinn Meshes nur ein kleiner Teil des Modells sind.
Alle Objekte und Funktionen, die das Präfix "tb" haben, sind Teile der Engine die ich benutze.
Es muesste eine D3DPT_TRIANGLELIST sein, probier das bitte mal bevor wir weitersehen.
tb - das ist die TriBase-Engine von David Scherfgen aus einem seiner Buecher? Das API kommt mir grob bekannt vor.
Re: [D3DX9] Assimp - Materialien
Verfasst: 11.09.2010, 23:54
von Oromis_32
Korrekt: TriBase - Engine. Ich war bisher zu faul, mir andere Engines anzuschauen und die finde ich recht einfach zu benutzen. Ich fahre ganz gut damit.
Ich habe schon öfters zwischen Trinaglelist und -strip hin und her gewechselt, kein großer Unterschied auszumachen.
Re: [D3DX9] Assimp - Materialien
Verfasst: 13.09.2010, 18:11
von Oromis_32
Gibt es denn keine Andere Stell, an der der Code hakt?
Bitte, helft mir!
Re: [D3DX9] Assimp - Materialien
Verfasst: 13.09.2010, 18:39
von Aramis
Nachtrag:
sind 47700 Vertizes und 14304 Indizes allein für Mesh 7 dieses Modells nicht ein wenig übertrieben?
jeep1.3ds? Das 7te Mesh hat 1192 Faces.
Faktor 12, ich vermute mal du hast ausversehen die Groesse des Indexbuffers in Bytes genommen.
Ich habe schon öfters zwischen Trinaglelist und -strip hin und her gewechselt, kein großer Unterschied auszumachen.
Es kann nur mit TriangleList funktionieren. Assimp liefert keine Strips, und du generierst sie auch nicht beim Konvertieren.
… der letzte DrawIndPr-Parameter ist afaik die Zahl der Primitiven - also m_pIB->GetSize()/3 fuer eine TriangleList. /12 wenn GetSize() die Groesse in Bytes zurueckgibt! (Merkwuerdige Aehnlichkeit mit obigem Nachtrag :-) )
Hast du mal die DirectX Debug-Runtime aktiviert und nach Fehlermeldungen geguckt? Mal PIX gestartet und nachgeguckt was wirklich gerendert wird? Der Quellcode sieht sonst fuer mich in Ordnung aus, zumindest was die Verwendung von Assimp angeht.
Gruß, Alex
Re: [D3DX9] Assimp - Materialien
Verfasst: 15.09.2010, 15:59
von Oromis_32
Der Hinweis auf den Bytes - mit - Vertizes - Verwechselt - Bug hat dazu geführt, dass mehr gerendert wird.... Ich habe einen Screen angehängt. Der rot umrandete Bereich vor dem Hintergrund der Wüstenlandschaften der Erde ist die aktuelle Interpretation des Jeeps... ;) Noch verbesserungswürdig...
Vllt habe ich noch einen ähnlichen Fehler drin, ich schaue gleich den Code zum 10101. mal an.
Der DX - Debugger sagt nichts erwähnenswertes. Und, öhhhhm, wahrscheinlich peinlich, aber was ist PIX?
Re: [D3DX9] Assimp - Materialien
Verfasst: 15.09.2010, 16:05
von Aramis
Du findest ihn im DX SDK - in irgendeinem /tools Verzeichnis, afaik hat es aber auch im Startmenue eine Verknuepfung. PIX zeichnet all deine D3D-Aufrufe komplett auf und erlaubt dir nachzuvollziehen was zu einem bestimmten Zeitpunkt der genaue Device-Status ist (u.a. kannst du dir den Inhalt deiner VBs grafisch anzeigen lassen, wenn dabei nur Schrott zu sehen ist hast du ihn entweder falsch befuellt oder die Vertexdeklaration ist falsch). Ein enorm nuetzliches Tool, nicht nur um Assimp-Modell-Renderer zu debuggen :-)
Re: [D3DX9] Assimp - Materialien
Verfasst: 15.09.2010, 17:05
von Oromis_32
WTF?!?!?
Ich habe gerade zwecks eines Tests des Spiels im LAN - Modus das Programm auf meinem Notebook laufen lassen. Das hat eine Intel - Onboard - Karte (!!). Auf diesem ist das Modell fehlerfrei gerendert, zumindest, wenn man von den völlig falschen Texturkoordinaten und dem inversen Cullmode absieht. Nachdem ich den Cullmode auf CW umgestellt hatte, kann man den Jeep ohne weiteres erkennen!
Jetzt stellt sich mir die Frage, warum meine HD 4870 nicht hinbringt, was mein Notebook (nach elendig langer Ladezeit ;) ) zustande bringt.
Re: [D3DX9] Assimp - Materialien
Verfasst: 15.09.2010, 17:16
von Aramis
PIX! Und die D3D-Debug Runtime. Kommen sicher haufenweise Fehlermeldungen :-)
Re: [D3DX9] Assimp - Materialien
Verfasst: 15.09.2010, 18:06
von Oromis_32
Nicht wirklich. Wie ich bereits gepostet hatte, gibt die D3D runtime keine Fehler aus, lediglich Warnungen, die nichts damit zu tun haben.
Was PIX angeht.... Ich kann damit zwar alle Aufrufe an DX - Funktionen nachvollziehen, aber keine VBs einsehen :-/
Re: [D3DX9] Assimp - Materialien
Verfasst: 23.10.2010, 12:41
von Oromis_32
OK, ich habe es jetzt, nach anderthalb Monaten herausgefunden. Der Fehler war lächerlich...
Jetzt ging es schon ganz schön voran, aber eine Frage hätte ich noch:
Die Meisten Modelle bestehen ja aus mehreren Teil-Meshes. Jeder Teil-Mesh hat auch eine Matrix, die die relative Position, Skalierung und Drehung zum vorhergehenden Mesh speichert.
Jetzt wüsste ich gern, wie ich diese Matrizen verrechne - also z.B. die aktuelle Weltmatrix mit der Matrix des Top-Level-Meshes.
Matrixmultiplikation habe ich ausprobiert, hat aber wie erwartet nicht funktioniert ;)