Texturfilterung

Sonntag, 21. Januar 2007
 / von Mr. Lolman & Raff & robbitop
 

Was kann man nun bezüglich der Bildqualität von einer Grafikkarte erwarten, deren Featureset schon zur Vorstellung als veraltet angesehen wurde? Tatsächlich ist die Bildqualität mit anderen Grafikkarten derselben Generation nur bedingt vergleichbar – dies ist jedoch nicht unbedingt im negativen Sinn gemeint.

Die Voodoo5 bietet mit den offiziellen Treibern standardmäßig keinen trilinearen Filter, auch wenn die Grafikkarte natürlich dazu in der Lage wäre. Allerdings kann dies ein VSA-100 nur bei Singletexturing in einem Rechenzyklus erledigen. Trotzdem wurde dem Chip die Möglichkeit zur Verfügung gestellt, die scharfen Detailgrad-Übergänge in texturierten Flächen zu mildern. So bieten die Treiber ein Feature namens "Mipmap-Dithering" an, welches die Mipmaps zu 50% mit der nächstkleineren Mipmapstufe überblendet.

Der offensichtliche Nachteil an diesem Modus ist eben das Dithering, welches die überblendeten Teile im Bild mit einer mehr oder minder stark sichtbaren Granularität versieht, die sich selbst nicht durch hohe Supersampling-Modi vollständig ausgleichen lässt. Auf der Haben-Seite verbucht dieser Modus einen niedrigen bis (je nach Anwendung, beispielsweise Quake III Arena) praktisch inexistenten Leistungsverlust bei gleichzeitiger Steigerung der Bildqualität.

Der weitaus interessantere Modus ist eine Art brilinearer Filter, der entsteht, wenn zwei VSA-100 im Supersampling-Modus rechnen und ein Chip das Mipmap-LOD-Bias um -0.5 versetzt. Dies funktioniert nur deswegen, da im Gegensatz zum herkömmlichen Supersampling Anti-Aliasing bei Voodoo5-Karten mehrere Bilder im T-Buffer gleichgewichtet zusammengemischt werden. Als Ergebnis ensteht ein Bild mit 1-Bit-LOD-Fraction, was von der Definition her tatsächlich als trilinearer Filter durchgeht. Wobei man jedoch erwähnen muss, dass 1-Bit-LOD-Fraction auf texturierten Flächen zwar eine deutliche Verbesserung zu einem rein bilinearen Filtering bringt, aber für eine gleichmäßige lineare MIP-Map-Interpolation noch nicht ausreichend ist.

Diese partielle LOD-Verschiebung ist jedoch nur mit SLI Anti-Aliasing möglich. Das heißt, dass eine Voodoo4 4500 nicht in der Lage ist, nach dem "Unum necessarium" Prinzip trilinear zu filtern, da jene Grafikkarte nur einen VSA-100-Chip hat und somit auch nur ein LOD-Bias-Register existiert. Andererseits bedeutet das wiederum, dass eine Voodoo5 6000 statt zwei Bildern mit unterschiedlichem LOD-Bias sogar vier solcher Bilder zusammenrechnen kann. Damit hat man anstatt eines zusätzlichen Mipmap-Übergangs gleich drei solcher Abstufungen mehr, also eine LOD-Fraction von 2 Bit.

Einer konsequenten Nutzung dieses Features stehen jedoch die Treiber im Weg: So hat man bei aktivem Anti-Aliasing diese performancemäßig sehr günstige, aber optisch minimalistische trilineare Filterung zwar mit jedem Originaltreiber, korrekt funktioniert sie aber nur bei einem LOD-Bias von 0.0 oder -1, da Änderungen am LOD-Bias unglücklicherweise nur auf den ersten Grafikchip appliziert werden und der zweite Grafikchip fix mit einem LOD von -0.5 rechnet. Glücklicherweise existiert jedoch ein modifizierter Glide-Treiber, welcher das LOD-Bias auch auf dem zweiten Grafikchip korrekt mit verschiebt.

Manche Leser werden sich schon die Frage gestellt haben, warum man das LOD-Bias überhaupt verschieben sollte, da ja 0.0 dem Optimum entspricht. Die Antwort ist simpel: Während die Konkurrenz ihr Supersampling Anti-Aliasing einfach durch eine interne Erhöhung der Auflösung (Oversampling) mit abschließendem Downsampling realisierte und dabei automatisch auch eine höhere Texturqualität erreichte, entsteht durch die 3dfx-Technik keine automatische Schärfung der Texturen, sondern lediglich eine Überabtastung der Texel. Diese lässt sich nun wunderbar mit einer Verschiebung des Mipmap-LOD-Bias ausgleichen. Theoretisch liegt die maximal mögliche Verschiebung bei -1 pro vier SSAA-Samples.

Praktisch entscheidet dies jedoch der persönliche Geschmack, denn der ideale Kompromiss zwischen maximal möglicher Schärfe und möglichst großer Texturruhe ist bei jedem Spiel woanders zu suchen. In der Praxis hat sich eine LOD-Verschiebung um -0.5 für 2x AA und -1.5 für 4x AA bewährt. Die erste Mipmap-Überblendung entsteht bei 4x Anti-Aliasing somit im Bereich von -2 bis -2.5, was ungefähr einer Schärfe von 4xAF entspricht (natürlich ohne dessen Texturruhe zu erreichen). Durch diese vergleichsweise große Verschiebung von -1.5 wird zwar das Nyquist-/Shannon-Abtasttheorem verletzt, allerdings bezieht sich das ohnehin auf den theoretischen Worstcase in Form von höchstfrequenten Texturen (beispielsweise pixelgroße Schwarz/Weiß-Schachbrettmuster).

So liegt mit vier Supersamples die tatsächlich maximal mögliche Schärfe, bei der man in keinem Fall eine Unterfilterung riskieren muss, nach konservativer Rechenmethode bei 2x AF [ld(n)=x]. Dies gilt jedoch nur bei einem "Ordered-Grid" Anti-Aliasing. Eine weniger konservative Rechenmethode würde neben den tatsächlichen Samplepostionen noch die, im Vergleich zur Basemap zwangsläufig verringerte, Amplitude der Mipmaps mit einbeziehen, was zumindest in dem Bereich, wo schon aus den Mipmaps gesampelt wird, automatisch eine höhere LOD-Verschiebung zulässt. Damit ließe sich zwar auch kein vierfaches "Lehrbuch-AF" errechnen, allerdings war dies in Anbetracht der durchschnittlichen Texturschärfe in den Spielen zu 3dfx-Zeiten oft auch gar nicht notwendig.

Das Streben nach scharfen Texturen fing auch nicht erst mit dem Aufkommen des anisotropen Filters an, im Gegenteil: Schon im Spiel Unreal wurden diverse Kniffe eingesetzt, um damalige Hardwarelimits etwas zu umgehen. Neben dem mittlerweile kaum noch notwendigen Detailtexturing (zusätzliche Texturüberlagerung zur Verbesserung der Nahdarstellung von Oberflächen) und dem heutzutage noch eher einsetzbaren Macrotexturing (zusätzliche Texturüberlagerung zur Verbesserung der Distanzdarstellung von Oberflächen) appliziert die Unreal Engine 1.x in Glide automatisch ein Mipmap-LOD-Bias von -1.5.

Dies bedeutet, dass mit bilinearer Filterung ohne Supersampling Anti-Aliasing bis zu 16 Texel der Basetextur sich ein einziges Bildschirmpixel teilen mussten. Ideal ist ein Verhältnis von 1:1, also kann man praktisch von 16facher Unterfilterung reden. Nach heutiger Bemessung ist das natürlich untragbar, aber 1999 wurde 3dfx für die gute Bildqualität in Unreal Tournament gelobt und ironischerweise hoben sich die 3dfx-Beschleuniger auch performancemäßig ab und gewannen trotz der durch das verschobene Mipmap-LOD-Bias bedingten höheren Rechenlast alle Benchmarks (wobei man fairerweise anmerken muss, dass die Unreal-Engine ziemlich perfekt auf Glide und damit Voodoo-Karten zugeschnitten war).