Vorschau auf Matrox Parhelia: DirectX 9 nicht ganz erfüllt

 2/6
Carsten Spille
9 Kommentare

DirectX 9

Höhere Präzision

Wie schon angesprochen, sind für DirectX9-Compliance, also vollständige Erfüllung der Spezifikation, Werte in Fließkommagenauigkeit unerläßlich, da sogar das 32Bit-Rendering langsam aber sicher an seine Grenzen zu stoßen scheint. An gewöhnlichen Level-Texturen wird dies nicht so leicht ersichtlich, jedoch zeigen diverse, per Pixelshader ermöglichte Effekte, besonders im Beleuchtungsbereich, wo sich viele Einzelwerte überlagern und immer wieder Rundungen vorgenommen werden müssen, bereits erste Einschränkungen. Dies geschieht aufgrund der sich immer weiter potenzierenden Rundungsfehler, die umso offensichtlicher werden, je öfter diese Rundungen nötig werden, also je mehr Texturschichten übereinandergelegt werden.

DirectX 8 forderte bereits die Möglichkeit, 8 Texturen pro Oberfläche verarbeiten zu können und John Carmack z.B., Chefprogrammierer bei id-Software, plant in seinem neuen Projekt Doom3 bereits fest mit bis zu elf Texturlagen.

Aus diesem Grunde ist bei DirectX 9 eine interne Renderinggenauigkeit von 40Bit, also 10Bit für jeden Kanal (RGBA, Rot, Grün, Blau und Transparenz) erforderlich, was jeweils einer Vervierfachung des Farbraumes pro Kanal ergibt. Trotzdem diese Genauigkeit nur intern verlangt ist, wird natürlich eine enorme Zusatzbelastung sowohl für Renderingeinheit als auch Speicherinterface erzeugt.

Displacement Mapping

Das Displacement Mapping ist eine von Matrox entwickelte Technik, die von Microsoft für die Verwendung in DirectX9 lizenziert wurde. Noch ist unklar, ob dies ein Must-Have oder ein optionales Feature ist.

Displacement Mapping
Displacement Mapping

Displacement-2

Durch die Modifikation des Dreiecksrasters in Bezug auf den entsprechenden Texturwert einer sogenannten Displacement Map wird hier, im Gegensatz zum Bump Mapping, mit den sich rein visuell ein ähnlicher Effekt erreichen ließe, die Geometrie verändert, was ein bislang ungekanntes Maß an Realismus erlaubt. Zusätzliche Geometrie ist aber, wie in obigem Beispiel zu sehen unbedingt erforderlich, um nicht einfach nur ein grobes, unkenntliches Etwas gerendert zu bekommen. Das Zauberwort heißt in diesem Falle "N-Patches", die es schon seit mehr als 9 Monaten in Form des "TruForm"-Features in ATis Radeon8500-Karten gibt. Dieses Feature wird nun auch bei Matrox zu neuem Leben erweckt.

Ein normales Dreiecksgerüst wird also zum Chip geschickt und dort mittels Tesselation (also der Unterteilung in mehrere kleine Polygone) soweit verfeinert, dass sich die Displacement Map anwenden läßt, ohne das es zu hässlichen Artefakten kommt, weil nicht genügend detaillierte Geometrie vorhanden ist.

Während Displacement Mapping somit quasi für die grobe Vorarbeit zuständig wäre, läßt sich das Ergebnis dieses Geometrie-Schrittes natürlich anschließend mittels Bump-Mapping (oder entsprechenden Pixelshader-Effekten) pixelgenau bearbeiten und so nochmals im Detailgrad verbessern ohne die gesamte Last einzig einem Teil des Chips aufzubürden, intelligente Arbeitsteilung also.Displacement-3 Wie nun auf dem linken Bild zu sehen ist, kann dabei der Detailgrad z.B. einer Landschaft enorm hoch ausfallen, ohne den Rest des System mit dem Transfer der riesigen Polygonmengen oder Vertexshader-Instruktionen zu belasten, wie es mit den herkömmlichen Methoden noch nötig wäre.

Das Problem an der ganzen Sache ist, das Displacement Mapping ohne vorherigen Einsatz der n-Patch Tesselation nicht sehr sinnvoll ist und unter Umständen gar nicht erfolgen kann. Das heißt auch in diesem Falle müssen wir auf entsprechend angepasste Programme warten, die dieses geradezu geniale Feature ausnutzen können.

Bei größeren Outdoor-Szenarien wäre aber auch ein Chip wie der Parhelia deutlich überfordert, wenn er den Detailgrad, der für die unmittelbare Umgebung nötig ist, um eine realistische Darstellung zu erreichen, auch noch für eine virtuelle Entfernung von 500m herstellen müsste. Gerade bei einer Landschaft, die so vielseitig (im mehrfachen Sinne) ist, wie eine zerklüftete Schlucht wäre das geradezu tödlich für die Performance.

Also wird ein recht simpler Trick angewandt, wie er schon für normale Texturen seit langem zum Einsatz kommt: Mip-Mapping. Dabei wird auch die Displacement Map in verschiedenen Detailgrade ins lokale RAM geladen und abhängig von der Entfernung eine jeweils passende Auflösung ausgewählt, da mit zunehmender Entfernung die Fähigkeit Details wahrzunehmen immer weiter sinkt.

So ist es möglich, nahe am Betrachter eine sehr fein aufgelöste Geometrie zu verwenden und die entfernteren Teile des Sichtbereiches dynamisch im Detailgrad anzupassen, während der Betrachter sich auf sie zu oder von ihr weg bewegt.


Displacement-4
Displacement-4

So schlägt man zwei Fliegen mit einer Klappe, da bislang immer der Programmierer mit großen Aufwand für ein funktionierendes und sinnvolles LOD-System (Level of Detail) zu sorgen hatte.

Displacement-5
Displacement-5

Im Ganzen läßt sich mittels Displacement Mapping sehr schön und vor allen Dingen mit relativ wenig Programmieraufwand sowohl ein gut funktionierendes Level-of-Detail System implementieren, als auch extrem detaillierte Geometrie erzeugen ohne dabei sämtliche Bussysteme des Computers mit Polygon- oder Texturdaten vollzumüllen.

Displacement-6
Displacement-6