Spiel-Mod: Crash mit D3DCREATE_HARDWARE_VERTEXPROCESSING
Spiel-Mod: Crash mit D3DCREATE_HARDWARE_VERTEXPROCESSING
Hallo,
ich versuche gerade, die Grafik eines älteren Spiels zu verbessern (Direct3D 9).
Da bin ich über D3DCREATE_..._VERTEXPROCESSING gestolpert und dachte mir, gleich die Performance zu verbessern, denn das Spiel nutzt D3DCREATE_SOFTWARE_VERTEXPROCESSING.
Setze ich jedoch D3DCREATE_HARDWARE_VERTEXPROCESSING oder auch D3DCREATE_MIXED_VERTEXPROCESSING, crasht das Spiel, sobald ein Level geladen wird.
Mit dem Debugger konnte ich ein bisschen etwas erkennen, scheinbar geht es um Skeletons und Matrizenrechnerei.
Meine Frage nun: Welche Restriktionen hat das hardware vertexprocessing? Auf irgendetwas von Direct3D kann wohl nicht zugegriffen werden, ich kann mir nur nicht vorstellen, was es sein könnte..
Danke jedenfalls!
MfG
ich versuche gerade, die Grafik eines älteren Spiels zu verbessern (Direct3D 9).
Da bin ich über D3DCREATE_..._VERTEXPROCESSING gestolpert und dachte mir, gleich die Performance zu verbessern, denn das Spiel nutzt D3DCREATE_SOFTWARE_VERTEXPROCESSING.
Setze ich jedoch D3DCREATE_HARDWARE_VERTEXPROCESSING oder auch D3DCREATE_MIXED_VERTEXPROCESSING, crasht das Spiel, sobald ein Level geladen wird.
Mit dem Debugger konnte ich ein bisschen etwas erkennen, scheinbar geht es um Skeletons und Matrizenrechnerei.
Meine Frage nun: Welche Restriktionen hat das hardware vertexprocessing? Auf irgendetwas von Direct3D kann wohl nicht zugegriffen werden, ich kann mir nur nicht vorstellen, was es sein könnte..
Danke jedenfalls!
MfG
- dot
- Establishment
- Beiträge: 1743
- Registriert: 06.03.2004, 18:10
- Echter Name: Michael Kenzel
- Kontaktdaten:
Re: Spiel-Mod: Crash mit D3DCREATE_HARDWARE_VERTEXPROCESSING
Was hast du für eine Grafikkarte?
- Schrompf
- Moderator
- Beiträge: 5013
- Registriert: 25.02.2009, 23:44
- Benutzertext: Lernt nur selten dazu
- Echter Name: Thomas
- Wohnort: Dresden
- Kontaktdaten:
Re: Spiel-Mod: Crash mit D3DCREATE_HARDWARE_VERTEXPROCESSING
Eigentlich sollte alles stressfrei auf heutigen GPUs laufen, was in alten Spielen in Software gemacht wurde. Du hast nicht zufällig den Code davon da, oder?
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Re: Spiel-Mod: Crash mit D3DCREATE_HARDWARE_VERTEXPROCESSING
Grafikkarte: AMD HD6970
Den Code vom Spiel habe ich nicht. Ich habe bloß ein bisschen von den damaligen Entwicklern erfahren.
Es wurde scheinbar sehr viel manuell gemacht (verschiedenste 3D-Berechnungen), aber was genau, ist schwer zu sagen.
Im Endeffekt muss es aber doch am Direct3D API liegen?! Ich frage mich, inwiefern es sich bei hardware vertexprocessing anders verhält, weil das Spiel damit scheinbar nicht klarkommt.
Den Code vom Spiel habe ich nicht. Ich habe bloß ein bisschen von den damaligen Entwicklern erfahren.
Es wurde scheinbar sehr viel manuell gemacht (verschiedenste 3D-Berechnungen), aber was genau, ist schwer zu sagen.
Im Endeffekt muss es aber doch am Direct3D API liegen?! Ich frage mich, inwiefern es sich bei hardware vertexprocessing anders verhält, weil das Spiel damit scheinbar nicht klarkommt.
- Schrompf
- Moderator
- Beiträge: 5013
- Registriert: 25.02.2009, 23:44
- Benutzertext: Lernt nur selten dazu
- Echter Name: Thomas
- Wohnort: Dresden
- Kontaktdaten:
Re: Spiel-Mod: Crash mit D3DCREATE_HARDWARE_VERTEXPROCESSING
Sicher nicht. Speziell DX9 ist so ausgereift und so oft benutzt, dass sicher nicht das eine Spiel plötzlich einen neuen Bug aufdeckt. Da ist es wesentlich wahrscheinlicher, wenn das Spiel irgendeinen Grenzfall absichtlich oder unabsichtlich ausgenutzt hat. Es wird in jedem Fall aber schwer, das Problem zu beheben, wenn Du keinen Sourcecode dafür hast.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
- Krishty
- Establishment
- Beiträge: 8308
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: Spiel-Mod: Crash mit D3DCREATE_HARDWARE_VERTEXPROCESSING
Ist es nicht so, dass man mit Software Vertex Shader die Vertex Buffer öfter/anders locken kann weil sie nicht im VRAM liegen?
Re: Spiel-Mod: Crash mit D3DCREATE_HARDWARE_VERTEXPROCESSING
Habe dazu nur gefunden, dass VBs/IBs dann nicht mit D3DUSAGE_SOFTWAREPROCESSING erstellt werden dürfen.
Das entfernen des Flags hat aber leider nichts gebracht. Weder das Erstellen noch das Locken von VBs/IBs schlägt nun fehl, trotzdem crasht es an gleicher Stelle.
Das entfernen des Flags hat aber leider nichts gebracht. Weder das Erstellen noch das Locken von VBs/IBs schlägt nun fehl, trotzdem crasht es an gleicher Stelle.
- Schrompf
- Moderator
- Beiträge: 5013
- Registriert: 25.02.2009, 23:44
- Benutzertext: Lernt nur selten dazu
- Echter Name: Thomas
- Wohnort: Dresden
- Kontaktdaten:
Re: Spiel-Mod: Crash mit D3DCREATE_HARDWARE_VERTEXPROCESSING
Gute Idee. Check außerdem mal den MEMPOOL - der muss für Hardware-Vertexprocessing auf DEFAULT stehen
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Re: Spiel-Mod: Crash mit D3DCREATE_HARDWARE_VERTEXPROCESSING
Tja, ich habe wohl den Übeltäter gefunden: D3DCAPS9::MaxVertexBlendMatrixIndex.
Mit software vertexprocessing ist der Wert 255, mit hardware VP nur 8.
Das Spiel führt eine andere Logik aus, wenn der Wert ((Index + 1) / 2) >= 64 ist.
Ich denke wohl nicht, dass man da was machen kann (also hardware vertexprocessing trotzdem zum Laufen zu bekommen), aber vielleicht fällt euch ja etwas ein.
Mit software vertexprocessing ist der Wert 255, mit hardware VP nur 8.
Das Spiel führt eine andere Logik aus, wenn der Wert ((Index + 1) / 2) >= 64 ist.
Ich denke wohl nicht, dass man da was machen kann (also hardware vertexprocessing trotzdem zum Laufen zu bekommen), aber vielleicht fällt euch ja etwas ein.
- Schrompf
- Moderator
- Beiträge: 5013
- Registriert: 25.02.2009, 23:44
- Benutzertext: Lernt nur selten dazu
- Echter Name: Thomas
- Wohnort: Dresden
- Kontaktdaten:
Re: Spiel-Mod: Crash mit D3DCREATE_HARDWARE_VERTEXPROCESSING
Hm. 8 Matrizen wäre verdammt wenig, selbst jede 10 Jahre alte GPU kann 64. Kannst Du das evtl. einfach faken? Ich habe keine Ahnung, wie genau Du mit DirectX interagierst, wenn Du eigentlich ein Spiel-Mod schreibst. Aber falls Du Dich irgendwie in die D3D-Calls reingehookt hast, könntest Du ja auch einfach diese Anzahl anpassen, wenn das Spiel nach den Caps fragt. Wie gesagt: die Hardware kann *wesentlich* mehr als 8 Matrizen.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Re: Spiel-Mod: Crash mit D3DCREATE_HARDWARE_VERTEXPROCESSING
Ja, ich verwende hooks.
Faken habe ich schon versucht, auch wenn es wenig Sinn ergibt, weil es die Grafikkarte dadurch ja trotzdem nicht kann. Ergebnis war fehlende und teils total verzerrte Polygone.
Meine Grafikkarte ist eine HD6970, doch erstelle ich das device mit D3DCREATE_HARDWARE_VERTEXPROCESSING, habe ich danach in MaxVertexBlendMatrixIndex tatsächlich nur 8 stehen.
Faken habe ich schon versucht, auch wenn es wenig Sinn ergibt, weil es die Grafikkarte dadurch ja trotzdem nicht kann. Ergebnis war fehlende und teils total verzerrte Polygone.
Meine Grafikkarte ist eine HD6970, doch erstelle ich das device mit D3DCREATE_HARDWARE_VERTEXPROCESSING, habe ich danach in MaxVertexBlendMatrixIndex tatsächlich nur 8 stehen.
- Krishty
- Establishment
- Beiträge: 8308
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: Spiel-Mod: Crash mit D3DCREATE_HARDWARE_VERTEXPROCESSING
Oh; ich sehe gerade dass es sowohl MaxVertexBlendMatrices als auch MaxVertexBlendMatrixIndex gibt: http://zp.amsnet.pl/cdragan/query.php?d ... escription
Was ist denn da der Unterschied? Wenn eine GPU nur vier Matrizen unterstützt, aber bis Index 57, bedeutet das, dass man nur vier Matrizen setzen darf, aber ruhig beginnend bei Slot 54?
Jedenfalls: Du kannst das Device mit D3DCREATE_MIXED_VERTEXPROCESSING erzeugen, und dann via IDirect3DDevice9::SetSoftwareVertexProcessing Software-Processing für den einen Draw-Call aktivieren, in dem sie 256 Matrizen verwenden.
Re: Spiel-Mod: Crash mit D3DCREATE_HARDWARE_VERTEXPROCESSING
Ah, das ist eine gute Idee. Leider funktioniert sie nicht. Selbst wenn ich SetSoftwareVertexProcessing() dauerhaft auf true lasse, die Objekte werden jetzt gar nicht mehr gezeichnet..
Naja, ich werd mich vielleicht irgendwann noch intensiver damit beschäftigen.
Naja, ich werd mich vielleicht irgendwann noch intensiver damit beschäftigen.