Das Half-Life 2 Multisampling Anti-Aliasing Problem
6. August 2003 / von Demirug / Seite 2 von 2
Lösung 1: "Centroid Sampling"
Im Zusammenhang mit dieser Problematik hat man in den letzten Tagen öfter den Begriff Centroid gehört. "Centroid Sampling" ist eine Technik, welche das Problem des ungünstigen Samplepunkts lösen soll. Die Lösung ist dabei denkbar einfach: Bei aktiviertem "Centroid Sampling" wird der Samplepunkt, falls er ausserhalb des Polygons liegt, einfach in dieses zurückverschoben.
Verschieben des Samplepunkts bei einem Randpixel
Dadurch ist sichergestellt dass die Texturkoordinaten nicht in einen Bereich fallen können, welcher gar nicht für dieses Polygon gedacht war.
Die Grafikchips von ATi sind nun - laut Aussage von ATi - fähig, diese Technik anzubieten. Das Problem, welches Valve und ATi hier haben, ist, dass der DirectX9 Standard den Einsatz von "Centroid Sampling" erst in Verbindung mit Pixel Shader 3.0 erlaubt. Um genau zu sein, ist es dort sogar ein Pflichtfeature, ohne das ein Grafikchip keine Pixel Shader 3.0 Kompatibilität melden darf.
Da ATi aber mit seinen derzeitigen Chips nur alle Pixel Shader 2.0 Pflichtfeatures erfüllen kann, bleibt dieser Weg zur Benutzung von "Centroid Sampling" verwehrt. Will Valve "Centroid Sampling" mit aktuellen ATi-Karten einsetzten, so müssen sie zusammen mit ATi einen Weg finden, dem Treiber diesen Wunsch mitzuteilen.
Dem Vorschlag, "Centroid Sampling" generell für alle Texturen über das Controlpanel des Treibers zu aktivieren, muss man dagegen etwas skeptisch gegenüberstehen, da diese Vorgehensweise durchaus zu anderen Problemen führen kann. Zum Beispiel ist "Centroid Sampling" für das Einblenden von Menüs und Statusanzeigen eher hinderlich und könnte dort am Rand zu Bildfehlern führen.
Als letzter Ausweg bliebe noch eine neue DirectX-Version, welche "Centroid Sampling" auch schon für Pixel Shader 2.0 Grafikchips als Option zulässig machen würde. Da Microsoft aber bisher noch keine Bestrebungen in diese Richtung gezeigt hat, würde eine solche Lösung - falls sich Microsoft jetzt noch dafür erwärmen könnte - für Valve und ATi wohl zu spät kommen.
Lösung 2: Korrektur der Texturkoordinaten im Pixelshader
Pixel Shader erlauben es, vor dem Auslesen einer Textur die Koordinaten dafür zu verändern. In den Pixel Shader Versionen 1.1 bis 1.3 sind die Optionen dafür aber sehr begrenzt, die (derzeit nur von ATi genutzte) Version 1.4 erlaubte da schon wesentlich mehr Freiheiten. Mit der Version 2.0 erreicht die Möglichkeit zur Veränderung der Texturkoordinaten ein sehr großes Maß an Freiraum. Dieser Freiraum kann nun dazu genutzt werden, die Texturkoordinaten vor dem Auslesen auf den zulässigen Bereich zu begrenzen.
Der Nachteil dieser Lösung im Vergleich zur ersten ist, dass zusätzlicher Rechenaufwand im Pixel Shader betrieben werden muss, welcher sich mit hoher Wahrscheinlichkeit auch auf die Performance auswirkt. Auch im Vertex Shader ist etwas zusätzlicher Aufwand zur Bestimmung der zulässigen Grenzwerte bei den Texturkoordinaten notwendig. Der Vorteil liegt aber darin, dass diese Lösung mit jedem Pixel Shader 2.0 fähigen Grafikchip ohne Tricks funktioniert, weil sie keine der DirectX-Spezifikationen verletzen muss.
Lösung 3: Auftrennung der zusammengefassten Texturen
Dies wäre der trivialste Ansatz - und gleichzeitig wieder derjenige, welcher auf jeder Grafikkarte funktionieren wird. Hierbei werden einfach die zusammengefassten Texturen wieder aufgetrennt und vom Spiel danach wieder als einzelne Texturen verwaltet. Natürlich erledigt sich damit der ursprünglich vorhandene Performance-Vorteil durch die zusammengefassten Texturen, dafür funktioniert diese Lösung aber wie gesagt mit jedem Grafikchip.
Diese mögliche Lösung wurde allerdings von Valve bisher noch nicht offiziell erwähnt.
Schlussbetrachtung
Aufgrund der nun gefunden Lösungsansätze wird Valve den Besitzern von DirectX9-Hardware den Genuss von Multisampling Anti-Aliasing sicherlich ermöglichen können. Für DirectX8-Hardware mit Multisampling Anti-Aliasing wäre die Lösung 3 eine Möglichkeit, welche von Valve aber wie bereits erwähnt bisher nicht angegeben wurde. Alternativ wäre noch der Einsatz von Supersampling Anti-Aliasing denkbar, aber aufgrund des hohen Ressourcenbedarfs dieser Lösung wäre die Spielbarkeit dieser Lösung mehr als fraglich.
Offen bleibt allerdings die Frage, ob Valve sich dazu entschließt, alle DirectX9 Shader-Programme mehrfach zu implementieren - einmal mit und einmal ohne die Multisampling Anti-Aliasing Anpassung. Dies ist zu hoffen, denn ansonsten müsste man auch ohne den Einsatz von Multisampling Anti-Aliasing den zusätzlichen Rechenaufwand für diesen Anti-Aliasing Fix bezahlen.
Die zweite noch zu klärenden Frage ist, wie sich Valve und ATi bezüglich des "Centroid Samplings" einigen werden, ohne die DirectX9-Spezifikation über Gebühr zu strapazieren. Auf Microsoft darf in dieser Situation wohl nicht gehofft werden, da es für einen kompletten Produktdurchlauf (Spezifikation, Entwicklung, Betaphase) mit einer neuen DirectX-Version eigentlich schon zu spät ist und die Größe der Änderung eine neue Version auch nicht rechtfertigen dürfte.
Für was genau sich Valve entschieden hat, ist derzeit noch nicht bekannt. Dennoch kann man davon ausgehen, daß Anti-Aliasing in Half-Life 2 auf allen Grafikchips möglich sein wird, denn in einem Chatlog von diesem Montag geben die dort befragten Valve-Mitarbeiter an, daß Anti-Aliasing auf allen Grafikkarten gefixt sei. Allerdings ging man nicht auf technische Hintergründe hierzu ein, es steht nach unserer Meinung somit zu erwarten, daß für verschiedene Grafikchips verschiedene Lösungen gemäß den drei vorskizzierten Möglichkeiten eingesetzt werden.