JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

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

Mixed vertex processing funktioniert nicht

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Dr. Best
Senior JLI'ler


Alter: 34
Anmeldedatum: 17.06.2004
Beiträge: 269
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 25.01.2007, 00:15    Titel: Mixed vertex processing funktioniert nicht Antworten mit Zitat

Tach,

ich habe in den vergangenen Wochen einen Loader für animierte *.x files geschrieben (ohne die Direct3D Extensions). Das wichtigste Feature um das es mir dabei ging ist natürlich das Vertex Skinning. Ich verwende Indexed Vertex Blending. Leider unterstützen selbst sehr aktuelle Grafikkarten oft nur eine recht begrenzte Anzahl an Transformationsmatrizen, die in vielen Fällen nicht reicht um alle Teile des Modells zu verarbeiten. Daher bin ich gezwungen für die Objekte, die mehr als die unterstützten Matrizen erfordern Software Vertex Processing zu verwenden.

Natürlich wäre es in Sachen Effizienz, die wohl größte erdenkliche Sünde deswegen komplett auf Software Vertex Processing umzusteigen. Die naheliegende Lösung ist also die Verwendung von Mixed Vertex Processing. Jetzt erstelle ich meine D3D Device wenn die erforderlichen Capabilities nicht vorhanden sind also mit Mixed Vertex Processing und erstelle alle Vertex Buffer, Index Buffer und Vertex Shader, die in Verbindung mit Vertex Blending verwendet werden mit dem Flag D3DUSAGE_SOFTWAREPROCESSING. Trotzdem verhält sich das Programm so als würde ich komplett Hardware Vertex Processing verwenden. Die Teile des Meshes, die auf Matrizen mit zu hohen Indizes zugreifen, werden nicht korrekt transformiert. Verwende ich hingegen komplett Software Vertex Processing funktioniert es einwandfrei.

Meine Frage also: Hat irgendwer hier schonmal mit Mixed Vertex Processing gearbeitet und weiß, was man dabei beachten muss oder hat eine Ahnung was ich vielleicht falsch mache? Dass aus irgendeinem Grund doch eine Hardware VP Device erstellt wird oder die Buffer und Shader nicht mit dem richtigen Flag erstellt werden, habe ich bereits per Debugmodus ausgeschlossen. Der Erroroutput der DX-Debug Version sagt auch nichts interessantes.

Für jede Hilfe im Voraus schonmal Danke,
mfG
Dr. Best
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen AIM-Name MSN Messenger
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 25.01.2007, 08:52    Titel: Antworten mit Zitat

Laut DX Docu erscheint mir das vvon dir beschriebene Verhalten korrekt zu sein:

If this flag is used, vertex processing is done in software. If this flag is not used, vertex processing is done in hardware.

Zitat:
The D3DUSAGE_SOFTWAREPROCESSING flag can be set when mixed-mode or software vertex processing (D3DCREATE_MIXED_VERTEXPROCESSING / D3DCREATE_SOFTWARE_VERTEXPROCESSING) is enabled for that device. D3DUSAGE_SOFTWAREPROCESSING must be set for buffers to be used with software vertex processing in mixed mode, but it should not be set for the best possible performance when using hardware index processing in mixed mode (D3DCREATE_HARDWARE_VERTEXPROCESSING). However, setting D3DUSAGE_SOFTWAREPROCESSING is the only option when a single buffer is used with both hardware and software vertex processing. D3DUSAGE_SOFTWAREPROCESSING is allowed for mixed and software devices.


Die Teile des Meshes, die auf Matrizen mit zu hohen Indizes zugreifen, werden nicht korrekt transformiert.

Wieviele matritzen wirken denn maximal gleichzeitig auf deine Vertexe? Selbst im Software Modus sollten das maximal (oder minimal?) 4 sein.
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Dr. Best
Senior JLI'ler


Alter: 34
Anmeldedatum: 17.06.2004
Beiträge: 269
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 25.01.2007, 11:37    Titel: Antworten mit Zitat

Ja, den Artikel hab ich auch schon gelesen. Deswegen find ich das ganze auch ziemlich merkwürdig Confused .

Und wegen deiner Frage hier nochmal kurz ne Erklärung wie genau Indexed Vertex Blending funktioniert. Ich hab's auch erst verstanden nachdem ich schon alles für normales Vertex Blending bereit gemacht hatte Very Happy . Das ganze ist aber eine wirklich praktische Sache. Das FVF wird dabei folgendermaßen erweitert. Es kommen bis zu drei Skinning Weights (float) dazu und vier Indizes (unsigned char). Dann schreibt man einfach in einen Vertexbuffer die ganzen Skinning Weights und bei den Indizes die zugehörigen Matrizen. Das vierte Skinning Weight ist dabei immer eins minus die andern Weights. Dann kann man an die D3D Device 256 Matrizen übergeben. Wie die Vertices dann berechnet werden verdeutlicht diese Grafik aus der DX SDK Documentation:

Daraus ergibt sich, dass ein Mesh von maximal 256 Matrizen beeinflusst werden kann, eine Triangle von maximal 12 Matrizen und ein Vertex von maximal vier Matrizen. Wenn das mal keine praktische Sache ist Wink .

Der Knackpunkt ist, dass nicht jede Grafikkarte im Hardware Modus volle 256 Matrizen unterstützt. Bei mir sind es zum Beispiel nur 37. Im Software Modus hingegen hat man immer Unterstützung für 256 Matrizen. Wenn man versucht mehr als die unterstützten Matrizen zu verwenden ist das Resultat, dass die Vertices die auf Matrizen mit zu hohen Indizes zugreifen transformiert werden als hätte man die Nullmatrix übergeben, d.h. ihre Screen-Space Position ist immer die Mitte des Bildschirms. Und genau das passiert auch bei der Verwendung von Mixed Vertex Processing. Im Software Modus hingegen funktioniert es einwandfrei.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen AIM-Name MSN Messenger
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 25.01.2007, 11:58    Titel: Antworten mit Zitat

Mh kannst du nicht einfach das Modell aufteilen? Ich habe mich ehrlich gesagt noch nie so richtig mit Skinning beschäftigt, glaube aber das HW Skinning schon immer das Problem hatte welches du nun auch hast.

Wenn ich dem hier alles richtig entnommen habe: http://ati.amd.com/developer/shaderx/ShaderX_CharacterAnimation.pdf

dann steht das dort auch ungefähr so drin das man noch einiges mit dem Mesh anstellen muss/kann damit alles sauber funktioniert.

Hier wird darauf noch expliziter eingegangen, evtl hilft dir das weiter:
http://cache-www.intel.com/cd/00/00/17/21/172124_172124.pdf
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Dr. Best
Senior JLI'ler


Alter: 34
Anmeldedatum: 17.06.2004
Beiträge: 269
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 25.01.2007, 20:27    Titel: Antworten mit Zitat

Die beiden Artikel waren wenig hilfreich. Im ersten wurde Vertex Blending mit Vertex Shadern umgesetzt. Dabei ergibt sich das gleiche Problem wie bei dem FFP Blending. Vertex Shader können nur eine begrenzte Anzahl an Vertex Shader Konstanten übernehmen (im Fall von VS 1.1 96) weshalb die Anzahl der Matrizen ebenso begrenzt ist. Der zweite erklärt ehr allgemein die Grundlagen des Vertex Blendings beantwortet aber nicht die Frage wie man dafür sorgt, dass das Vertex Blending im Software Modus durchgeführt wird.

Den Mesh aufzuteilen ist natürlich eine Lösung, aber besonders gefallen tut sie mir nicht. Viele etwas ältere Grafikkarten unterstützen ja nur sehr wenige Blending Matrizen, z.B. 4. Wenn ich also zum Beispiel das Model tiny.x aus dem DX SDK entsprechend aufteile erhalte ich um die 60 Subsets. Und wie jeder weiß ist jeder DrawIndexedPrimitive(...) Aufruf Performancetechnisch ziemlich teuer. Außerdem müsste ich dann ja komplett auf eine Software Device umsteigen wenn eine Grafikkarte garkein Indexed Vertex Blending unterstützt.

Ich werde wenn ich am Samstag mal was mehr Zeit habe mit dem Render State D3DRS_SOFTWAREVERTEXPROCESSING rumprobieren. Wenn der funktioniert könnte ich in meiner Anwendung eine Liste aller Objekte erstellen, die Vertex Blending verwenden und diese dann abgesondert vom Rest nach einstellen dieses Render States rendern. Wenn's funktioniert ist es im Vergleich zu einer kompletten Software Device oder aufgeteilten Meshes wohl das kleinste von drei Übeln.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen AIM-Name MSN Messenger
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL Alle Zeiten sind GMT
Seite 1 von 1

 
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