Pixelkunst

3D-Grafik zwischen Prozessor und Monitor

Wissen | Know-how

Willkommen, Polygon, in unserem gigantischen 3D-Vergnügungspark. Wir haben weder Kosten noch Mühen gescheut und jede Menge spektakuläre Attraktionen auf gigantische zehn Millionen Transistoren verteilt. Begib Dich auf einen rasanten Ritt durch die wunderschöne Parallel- und Pipeline-Architektur unseres großartigen High-Tech-Chips. Bitte aufrücken und nach vorne schauen.

Wie es aussieht, scheinen derzeit Spiele, Spiele und dann noch Spiele der maßgebliche Fortschrittsmotor des PC zu sein. Prozessorhersteller Intel läßt seine bunten Männlein zwar offiziell `multimedial´ tätig sein, hat aber offenbar hauptsächlich `fun´ im Sinn. Selbst seriöse PC-Hersteller kehren bei ihren High-End-Systemen heute die Spieleleistung heraus - noch vor drei Jahren undenkbar: Hochwertiges war seinerzeit untrennbar mit dem Begriff `server-tauglich´ verbunden.

Trotz Prozessorerweiterungen wie MMX oder 3DNow! (mehr darüber im gedruckten Heft, S. 188), die lediglich unterstützend wirken, sind vorwiegend die 3D-Chips auf den Grafikkarten für die hohen Leistungen bei 3D-Anwendungen und Spielen verantwortlich. Obwohl die PC-Branche seit eh und je ein rasantes Innovationstempo vorlegt, fällt der Vorwärtsdrang bei den Grafikchipherstellern aus dem Rahmen: Fast halbjährlich kommen deutlich verbesserte Bausteine auf den Markt.

Jede Neuerung geht mit neuen, dem normalen PC-Anwender rätselhaften Schlagwörtern einher: Zwischen CPU und Auge liegen viele Stationen wie Setup-Engine, Rasterprozessor, diverse Pufferspeicher, RAMDAC und Monitor. Spielen diese nicht optimal zusammen, bleibt das Bild grob und wenig realitätsnah, oder Bildsequenzen ruckeln. Die Grafikkartenhersteller werben dagegen mit Megapixeln und Kilopolygonen pro Sekunde, führen Mehrfach-Pipelines, Triple-Buffering, MIP-Mapping sowie Anti-Aliasing ins Feld und versprechen so den maximalen Spielespaß. Auf der Strecke bleibt der Käufer, der von dieser Fachwort-Kaskade erschlagen wird.

Wer die Entwicklung der 3D-Grafik nicht hautnah und kontinuierlich verfolgt, zweifelt vermutlich immer mehr am Sinn und Nutzen all dieser Verbesserungen - zu Unrecht. Was heutigen PCs zum Spielen in Echtzeit (50 Bilder pro Sekunde) abverlangt wird, hat die Qualität guter Computertrick-Sequenzen, die man sich noch vor 10 Jahren nur für teure TV-Produktionen hätte leisten können. Da hätten Großrechner die Videosequenzen mühsam Einzelbild für Einzelbild berechnet und für jedes mehrere Minuten gebraucht. Zugegeben, ganz so filigran und detailgetreu geht es bei PC-Spielen noch nicht zu. Im Gegenteil, man benutzt eine Menge neuer Tricks, um Rechenleistung trotz möglichst realistischer Eindrücke zu sparen - man überlistet gekonnt das menschliche Sehvermögen.

In diesem Artikel finden Sie eine Bestandsaufnahme der 3D-PC-Grafik, die Ihnen die Einschätzung der am Markt befindlichen 3D-Karten erlaubt. Der nachfolgende Test aktueller 3D-Grafikkarten gibt Ihnen weitere Hilfestellung. Das Gebiet `3D-Grafik´ ist seiner wirtschaftlichen Bedeutung gemäß groß und unübersichtlich geworden. So erwartet Sie kein gemütlicher Spaziergang durchs Technik-Museum, sondern eine Tempo-Fahrt durch 3D-Land.

Auch bei aktuellen 3D-Grafikkarten erledigt der PC noch das Dreiecks-Setup, bestimmt also für den Rasterprozessor, wo welche Polygone wie zu zeichnen sind (Unterlegungen kennzeichnen Lesezugriffe auf den Textur- oder Bildspeicher).

Bei heute gängigen 3D-Grafikkarten für zu Hause und das Büro übernimmt noch die PC-CPU das sogenannte `Dreiecks-Setup´, also das Festlegen, welche Bildelemente wo liegen - sie gibt mehr oder weniger die Szenerie vor, die dann der Render- oder Rasterprozessor mit bunten Bildpunkten füllen muß. Dabei werden komplexe Objekte wie Fahrzeuge in unzählige kleine Vielecke, meist Dreiecke, eben Polygone aufgespaltet. Diese kleineren Objekte kann der Rasterprozessor wesentlich leichter ausfüllen, schattieren oder sonstwie manipulieren. Nur Profikarten im Bereich von einigen tausend Mark enthalten heute auch einen Setup-Prozessor, der unabhängig von der PC-CPU die Szenerie berechnet.

Der 3D-Chip pixelt ein Polygon, indem er die Eckpunktdaten, also die Bild- und Texturkoordinaten, über das Polygon interpoliert. Der Setup-Prozessor übernimmt die Berechnung der dafür benötigten Kantensteigungen und Pixelschrittweiten.

Für die einfachste Aufgabe des Render-Prozessors, das schlichte Füllen eines Polygons mit einer Farbe, reichen die X/Y-Koordinaten seiner Eckpunkte und ein Farbwert (RGB) aus. Enthält jeder Eckpunkt unterschiedliche Farbwerte, dann läßt sich bereits ein Farbverlauf erzeugen, indem man die Farben zwischen den Ecken interpoliert (Gouraud-Shading). Ein Transparenzwert (Alpha oder A) variiert die Durchsichtigkeit eines Polygons und läßt sich beispielsweise zur Simulation einer Wasseroberfläche, einer Glasscheibe oder eines schnell rotierenden Propellers einsetzen. Üblicherweise ist das Alpha für alle drei Eckpunkte identisch; um ein Polygon sanft ein- oder auszublenden, ändert man die Transparenz geringfügig nach jedem berechneten Bild.

Wünschenswert wäre, wenn ein Objekt eine differenzierte Farbstruktur besäße. Dazu müßte das Objekt jedoch aus sehr vielen, sehr kleinen Polygonen bestehen, um jedem Eckpunkt eine unterschiedliche Farbe zuzuweisen. Wesentlich effizienter ist dagegen das Textur-Mapping, das Objekte mit einer zweidimensionalen Bitmap, quasi einem Abziehbildchen, `beklebt´ - um eine Flasche ließe sich beispielsweise ein Etikett wickeln. Jedem Eckpunkt sind daher zwei Texturkoordinaten (U, V) zugeordnet, die auf die Ecken oder Positionen innerhalb eines 2D-Bildes verweisen. Interpoliert man die Texturkoordinaten über das Polygon, dann lassen sich die Texturpixel (Texel) aus einem externen Texturspeicher lesen und an die zugehörigen Pixelpositionen setzen. Eine Textur enthält gegebenenfalls neben den Farbwerten auch Transparenzwerte. Komplett transparente Texel entfernen aus einem Polygon Bereiche, die ansonsten mit einer Vielzahl von Polygonen explizit modelliert werden müßten (z. B. die Maschen eines Netzes).

Normalerweise erfordern feine Oberflächenstrukturen wie die Rinde eines Baumes ebenfalls eine Vielzahl von Polygonen. Textur-Mapping kann zwar das farbige Abbild einer Baumrinde wiedergeben, die dreidimensionale Struktur jedoch nur schwer vermitteln. Bump-Mapping simuliert eine Oberflächenstruktur, indem es nicht die Geometrie eines Objektes variiert, sondern die Beleuchtung. Das Auge läßt sich bei feinen Strukturen eher von der Helligkeit leiten und schließt aus dem Unterschied zwischen beleuchteten und abgeschatteten Pixeln auf einen geometrischen `Verursacher´. Bump-Mapping wirkt vor allem deshalb überzeugend und plastisch, weil die Bewegung einer Lichtquelle oder eines Objekts zu einer entsprechend angepaßten Helligkeitsänderung führt.

Damit sich später feststellen läßt, welche Polygonteile weiter entfernt liegende Polygonteile aus Betrachtersicht verdecken, besitzt jeder Eckpunkt außerdem eine Tiefenkoordinate (Z). Den Abschluß der Parameterliste pro Eckpunkt bildet die sogenannte homogene Koordinatenkomponente (W) zur perspektivischen Korrektur.

Die Setup-Engine entfernt üblicherweise als erstes alle Polygone eines Objektes, die vom Betrachter wegzeigen und unsichtbar sind. Eine ausgewiesene Polygonleistung eines 3D-Chips von beispielsweise 8 Millionen Polygonen pro Sekunde bezieht sich meist darauf, gegebenenfalls alle 8 Millionen Polygone wegzuwerfen - da besteht eine Analogie zu Prozessoren, wo gelegentlich die Maximalrate an MFlops auf NOP-Befehlen beruht.

Aus den Eckpunktparametern bestimmt der 3D-Prozessor anschließend alle Zwischenwerte innerhalb des Polygons durch lineare Interpolation. Um jedes Pixel innerhalb eines Polygons zu erreichen, hangelt sich der Chip üblicherweise Zeile für Zeile an einer Polygonkante entlang. Innerhalb einer Zeile tastet er sich schrittweise zum jeweils benachbarten Pixel bis zur anderen Polygonkante. Das Setup berechnet daher für jeden zu interpolierenden Parameter zwei Konstanten vor: eine Kantensteigung für eine Bewegung in Y-Richtung und eine Pixelschrittweite für eine Bewegung in X-Richtung. Danach beginnt die Rasterung (das Setzen der Pixel), indem von einem Starteckpunkt ausgehend entweder die Kantensteigungen der Parameter addiert werden oder die Pixelschrittweiten. Alle Recheneinheiten sind dabei parallel geschaltet, so daß der Datenpfad in dieser Phase der Rendering-Pipeline mehrere 100 Bits breit ist.

Die nachfolgenden Rechenoperationen bestimmen, welche Farbe ein Pixel letztendlich besitzt und ob es überhaupt zu sehen ist. Im ersten Schritt der Pixelpipeline werden jedoch zunächst die Parameter perspektivisch korrigiert, um Bildverzerrungen zu beheben. Die Notwendigkeit einer Perspektivkorrektur ergibt sich aus dem Widerspruch zwischen der linearen Interpolation der Parameter und der nichtlinearen Eigenschaft der perspektivischen Verkürzung. Mit wachsender Entfernung zum Betrachter verkleinert sich nämlich ein Polygon bezüglich der bedeckten Pixelfläche überproportional. So müßten die Texturkoordinaten eine Textur nicht in konstanten Abständen abtasten, sondern in immer größeren Abständen. Dabei nimmt die Auffälligkeit des Bildfehlers zu, wenn Größe oder Betrachternähe des Polygons zunehmen. Mit Hilfe der homogenen Koordinatenkomponente W lassen sich die Parameter perspektivisch korrigieren, wobei bereits die Setup-Engine entsprechende Vorbereitungen getroffen hat (homogene Koordinaten der Parameter).

Zunächst muß der Rasterprozessor prüfen, ob ein Pixel sich hinter oder vor einem bereits gerenderten Pixel befindet. Da der Chip nur das aktuelle Polygon kennt, benötigt er neben dem Speicher für den Farbwert einen weiteren Speicher (Z-Buffer), der die Tiefe (Z) aller vorher gerenderten Polygone vermerkt. Interessant ist dabei jedoch nur der vorderste Z-Wert. Jeder Bildwechsel setzt zu Anfang alle Z-Werte auf unendlich (maximale Entfernung vom Betrachter). Anschließend vergleicht der Chip pro Pixel den Z-Wert des neuen Polygons mit dem im Z-Buffer abgelegten Wert. Nur wenn der neue Z-Wert kleiner und damit sichtbar ist, speichert man den noch zu berechnenden RGB-Wert im Farbspeicher und den Z-Wert im Tiefenspeicher.

Die Verdeckungsbestimmung funktioniert theoretisch nur mit einem unendlich genauen Tiefenspeicher fehlerfrei: So kann beispielsweise der Tiefenabstand zwischen dem Z-Wert einer Wand und dem Z-Wert eines davor aufgehängten Bildes beliebig klein ausfallen. In der Praxis darf der Tiefenabstand einen bestimmten Mindestabstand aber nicht unterschreiten, da sich zwei Tiefenwerte dann nicht mehr voneinander unterscheiden lassen. Der Mindestabstand ergibt sich aus der Sichttiefe der dargestellten Szene und der dafür zur Verfügung stehenden Speicherauflösung. Für ein Spiel mit einer geringen Sichttiefe (z. B. 100, die Maßeinheit ist ohne Relevanz) reicht ein 16-Bit-Z-Buffer (Mindestabstand: 100/65 536) in der Regel aus. Größere Sichtweiten erfordern unter Umständen eine höhere Genauigkeit, weil sich der kritische Mindestabstand sonst vergrößert und über dem unverändert gebliebenen Tiefenabstand zweier Polygone liegen könnte.

Neben der Auflösung des Tiefenspeichers beeinflussen zwei weitere Faktoren eine korrekte Verdeckungsbestimmung: Üblicherweise rechnet der Chip mit Festkommazahlen (skalierte Ganzzahlen). Kleine Zahlen (nahe Objekte) besitzen dadurch eine deutlich geringere Genauigkeit als große Zahlen (entfernte Objekte). Eine Gleitkommazahl arbeitet dagegen über den gesamten Sichtbereich mit maximaler Genauigkeit.

Das zweite Problem hängt mit der perspektivischen Verkürzung der Z-Werte zusammen: Die Z-Werte liegen im Tiefenspeicher (Z-Buffer) nichtlinear verteilt vor. Mit wachsender Entfernung zum Betrachter sind die Z-Werte der Objekte zunehmend gestaucht, so daß weit entfernte Polygone sehr dicht zusammenliegen und wiederum den Mindestabstand unterschreiten können. Nimmt man hingegen den perspektivisch korrigierten W-Wert, der ebenfalls eine Entfernung ausdrückt, und vergleicht ihn mit dem im Tiefenspeicher abgelegten W-Wert (W-Buffering), dann ergibt sich eine lineare Tiefenverteilung.

Ein Tiefenspeicher teilt sich gelegentlich den Speicher mit einem Stencil-Buffer (Stencil = Schablone, meist mit 8-Bit-Auflösung); letzterer schützt bestimmte Bildschirmbereiche (Cockpit, Head-up-Display) vor einem Überschreiben durch später gerenderte Polygone einer Szene. Ebenso ermöglicht er eine Schattenerzeugung nach dem Schattenvolumen-Verfahren. Zu einem Framebuffer (Bildspeicher) gehören alle Puffer, die sich mit den XY-Bildschirmkoordinaten adressieren lassen: Farbpuffer, Z/W-Puffer, Stencil-Puffer oder weitere Bildpuffer (siehe `V-Sync´).

Über die Texturkoordinaten greift der 3D-Chip auf den Texturspeicher zu. Im einfachsten Fall liest er lediglich ein einziges Texel aus. Um die damit verbundenen unnatürlichen Bildstörungen (Artefakte) zu beseitigen, ist es üblich, mehrere Texel auszulesen und zu filtern (dazu später mehr). Diese Vorgehensweise führt allerdings zu Bandbreitenproblemen, die ein kleiner Textur-Cache nicht allein lösen kann. Komprimierte Texturen (Farbraum-Konvertierung, Vektor-Quantisierung, S3TC) reduzieren zum einen die steigenden Anforderungen an Übertragungsrate und Zugriffszeit der Speicherbausteine und zum anderen den wachsenden Bedarf an Texturspeicher insgesamt. Von der Komprimierung profitiert aber auch der Rechner dank verringerter Belastung des PCI-Bus oder des AGP (Advanced Graphics Port).

Texturen gelangen entweder über PIO/DMA-Betrieb zunächst in den lokalen Texturspeicher und dann zum Chip oder werden mittels AGP-Texturing direkt angefordert. Aufgrund der gemeinsamen Nutzung durch CPU und Einsteckkarten - beispielsweise der Soundkarte - des ohnehin langsamen Hauptspeichers, der verzögernden Zugriffskonflikte und der nichtsequentiellen Übertragung kleiner Texturausschnitte erzielt AGP-Texturing nur eine mäßige Performance [4] - und ist damit eher eine Option für selten benötigte, sehr große Texturen oder eine aus sehr vielen Einzelbildern bestehende Texturanimation.

Sehr effizient lassen sich True-Color-Texturen (24 Bit RGB) über eine 8-Bit-Textur-Palette kodieren. Eine Textur enthält dazu 256 Indizes, die auf eine Farbtabelle (Color-Lookup-Table, CLUT) mit 24-Bit-Farbwerten verweisen. Obwohl eine einzige Textur lediglich aus einem begrenzten True-Color-Spektrum wählen darf, kann jede Textur durch Nachladen der passenden Tabelle auch komplett andere Farben besitzen. Oft sind 16-Bit-Texturen einfach in einem 565-RGB-, 5551-RGBA- oder 4444-RGBA-Bit-Format definiert, die der Chip ins interne 8888-RGBA-Format umwandelt. Neben der Interpolation der Texturkoordinaten und der Perspektiv-Korrektur beinhaltet eine Textureinheit also Adreßberechnung, Cache, Dekompression, CLUT, Formatkonvertierung und Filterung.

Die folgenden Pipelinestufen kombinieren jeweils zwei Farben zu einer Mischfarbe. Das Mischen von Farbwerten (Blending) läßt sich flexibel handhaben: Eine Multiplikation (Modulation) kombiniert eine diffuse Lichtfarbe mit der Texel-Farbe, was eine Textur abdunkelt. Die Mischung von spiegelndem Licht (Glanzlichter, Specular Highlight) und Textur ist als Addition implementiert und hellt die Textur auf.

Das Mischungsverhältnis von Nebelfarbe (Fog, F) und aktueller Farbe hängt von der Entfernung ab. Der Nebelanteil erhöht sich mit zunehmender Distanz und verstärkt so den Tiefeneindruck einer Szene. Da Spiele-Entwickler die Sichtweite wegen fehlender Z-Buffer-Genauigkeit oder Rechenleistung begrenzen, lassen sich näherkommende oder vorher unsichtbare Objekte zudem sanft in die Szene einblenden.

Alpha-Blending verknüpft die Pixelfarbe von bereits in den Bildspeicher gerenderten Polygonen mit der aktuellen Farbe, bevor das resultierende Pixel schließlich in den Bildspeicher zurückgeschrieben wird. Der Alpha-Wert (üblicherweise 8 Bit breit) dient dabei als Gewichtungsfaktor der beiden Farbanteile. Ein hoher Alpha-Wert läßt ein Pixel stark durchsichtig erscheinen, ein kleiner Wert verringert den Transparenzeffekt.

Problematisch wird das Alpha-Blending, wenn eine Szene aus mehreren, transparent übereinanderliegenden Polygonen besteht. Das Ergebnis der Blending-Operation hängt von der Tiefenanordnung der Pixel ab (welches ist Vorder-, welches Hintergrund?). Das Z/W-Buffering entfällt dabei zwangsläufig, da sich transparente Pixel nicht komplett verdecken. Um eine konsistente Blending-Reihenfolge zu gewährleisten, muß die Applikation zunächst alle transparenten Polygone nach ihrer Tiefe sortieren. Die damit verbundenen Schwierigkeiten [1] sind jedoch der Grund dafür gewesen, einen Tiefenspeicher zu verwenden. Videologics PowerVR der zweiten Generation (PVRSG) übernimmt als bisher einziger 3D-Chip die Tiefensortierung aller Pixel, bevor er jeweils zwei Pixel miteinander blendet. Allerdings halten Spiele-Entwickler die Anzahl transparenter Polygone (noch) klein, so daß eine Sortierung die normalerweise benutzte CPU nicht übermäßig beansprucht.

Das Rennspiel Need for Speed III nutzt viele gängige 3D-Effekte zum Erzeugen realitätsnaher Szenen, leistet sich allerdings manchmal kleine Ausrutscher bei Schatten.

Neben dem Alpha-Blending gehört mittlerweile das sogenannte Multi-Texturing zu den gewünschten Eigenschaften eines 3D-Chips. Darunter versteht man das Überlagern mehrerer Texturen auf ein Polygon. Die grundsätzliche Fähigkeit eines 3D-Chips zum Multi-Texturing bezieht sich darauf, Texturkoordinaten für mehrere Texturen pro Eckpunkt entgegenzunehmen und mehrere Texel intern miteinander zu verknüpfen.

Die konkrete Implementierung von Multi-Texturing, also wie viele Texturen ein Chip in einem einzigen Durchlauf bearbeitet und welche Geschwindigkeitsverbesserungen sich dadurch erzielen lassen, bleibt dem Chipentwickler freigestellt; üblich ist eine Single-pass/Two-textures-Architektur, also das Berechnen zweier Texturen in einem Rechengang. Eine zweite, komplett parallel arbeitende Rasterpipeline stellt die flexiblere Erweiterung dazu dar. So verfügt ein Chip in der Regel entweder nur über eine zweite Textureinheit (doppelte Texelrate, MTexel/s) oder besitzt fast die gesamte Transistorlogik nach dem Setup in zweifacher Ausführung (doppelte Pixelrate, MPixel/s). Die zweite Variante erzielt eine doppelte Pixel-Performance, falls keine zweite Textur benötigt wird. Zwei Rasterpipelines mit jeweils zwei Textureinheiten verdoppeln die Pixel-Performance auch bei zwei genutzten Texturen.

Multi-Texturing basiert im Kern auf einer leistungsfähigen und programmierbaren Blending-Unit, die alle Modi für Licht-, Nebel-, und Alpha-Blending mit weiteren Variationen (Detail, Gloss, Dark Light) anreichert. Zahlreiche Kombinationsmöglichkeiten bieten sich an: Schattentexturen, Detailtexturen (Kratzer, Dreck), volumetrische Nebel (räumliche Dichteverteilung), Environment- beziehungsweise Reflection-Maps (Spiegelung/Reflexion der Umgebung oder Lichtquellen), diffuse Maps (farbige Lichtquellen, Scheinwerfer) oder Bump-Maps. Einige 3D-Prozessoren unterstützen lediglich Bump-Mapping speziell in Hardware. Allerdings lassen sich nicht alle Texturen problemlos über die Blending-Unit kombinieren, wodurch weiterhin mehrere `alpha-geblendete´ Durchläufe anfallen. Eine zweite Rasterpipeline besitzt hier Vorteile gegenüber einer zweiten Textureinheit.

Die Pixel-Performance (Fill Rate) entspräche in etwa der doppelten Taktrate des Rasterprozessors, wenn nicht die Zugriffszeit (Latenz) der Speicherbausteine zusätzliche Wartezyklen erfordern würde [3]. SG/SDRAMs erreichen ihre maximale Übertragungsrate nur bei einem sequentiellen Zugriff auf Daten innerhalb einer Speicherzeile (Burst). Verantwortlich für die Verzögerungen und enormen Speicheranforderungen sind die Umschaltungen zwischen Lese- und Schreibzugriff (Alpha-Blending, Z/W-Buffering, Stenciling), die Adreßwechsel (zwischen Bild- und Texturspeicher sowie mehreren Speicherzeilen) und die zu transportierende Datenmenge insgesamt (RAMDAC, Texturen, Bildspeicher). Entsprechend vielfältig und aufwendig gestalten sich die Maßnahmen der Chip-Hersteller [2]: Unterstützung schnellerer Speicherbausteine, breitere oder getrennte Datenbusse für Textur- und Bildspeicher, große oder `intelligente´ Caches, ka-chelorientierte Speicheraufteilung, Adressierung oder Rasterung.

Ein 3D-Chip rechnet zwar intern mit 32 Bit Farbauflösung, die Speicherung der Farben und Tiefenwerte erfolgt jedoch wegen der Bandbreitenproblematik meist mit jeweils 16 Bit. Um die bei 16-Bit-Farben sichtbaren Farbabstufungen (Mach-Banding) zu reduzieren, nutzt der Chip das Dithering. Dieses Verfahren verteilt die verfügbaren Farben unregelmäßig zwischen den Farbabstufungen, da das menschliche Sehsystem als `Kantenverstärker´ saubere Farbtrennungen deutlicher wahrnimmt als Farbrauschen; die fehlenden Zwischenfarben interpoliert es dann automatisch. Allerdings verstärkt Alpha-Blending mit jedem Durchlauf das Farbraster, während sich die Farbauflösung gleichzeitig verringert. Optional unterstützen daher fast alle 3D-Prozessoren auch einen 32-Bit-Farb- und Tiefenspeicher.

Mit der Texturfilterung verbinden sich zahlreiche Begriffe. Nähert sich zum Beispiel ein Betrachter einem großen Polygon, dem eine aus 128 x 128 Texeln bestehende Textur zugeordnet ist, dann wird ein einziges Texel auf mehrere Pixel abgebildet. Als Folge dieser Überabtastung stellt sich ein unschöner Klötzcheneffekt ein, den die bilineare Filterung mildert. Dazu liest die Textureinheit pro Bildpunkt vier Texel in der quadratischen Umgebung des Abtastpunktes aus und interpoliert die Farbwerte je nach Entfernung zum Abtastpunkt in beiden Richtungen der 2D-Textur bilinear. Die Berechnung des neuen Farbwertes ist somit keine einfache Mittelwertbildung, sondern berücksichtigt die Abstände zu den Mittelpunkten der Pixel/Texel-Flächen.

Nicht nur die Filterung erfordert ein Rechnen mit Nachkomma-Genauigkeit respektive im Subpixel/-texel-Bereich. So beseitigt die Subpixelkorrektur der Texturkoordinaten ein Texelflimmern, wenn ein Polygon seine Position geringfügig (z. B. um ein halbes Pixel) ändert. Die Subpixelkorrektur der Tiefenkoordinaten und Farbwerte behebt vergleichbare Artefakte.

Entfernt sich der Betrachter von dem Polygon, dann entfallen auf ein einziges Pixel mehrere Texel und die Textur ist unterabgetastet. Eine Unterabtastung eines Signals - in diesem Fall der Textur - bezeichnet man als Aliasing. Ohne Gegenmaßnahmen (Anti-Aliasing) würde in einer Animation das texturierte Polygon flimmern. Im ungünstigsten Fall verkleinert sich das Polygon auf die Größe eines Pixels, dem die komplette Textur zugeordnet ist. Da der 3D-Chip nicht in wenigen Takten 128 x 128 Texel filtern kann (wie es korrekt wäre), wird die Textur von der PC-CPU bereits grob hierarchisch vorgefiltert. Die Originaltextur liegt dann in mehreren, jeweils geviertelten und stärker gefilterten Auflösungsstufen (128 x 128, 64 x 64 ... 1 x 1) vor: eine MIP-Map (multum in parvo, vieles im kleinen). Die vom 3D-Chip zu erledigende und wiederum vereinfachte Rechenarbeit besteht darin, eine geeignete Auflösungsstufe auszuwählen (Mip-Mapping).

Weil ein Wechsel der Auflösungsstufe zu Farbsprüngen führt, interpoliert die lineare Mipmap-Filterung zwischen zwei Texeln benachbarter Mip-Texturen. Die trilineare Filterung interpoliert zunächst beide Mip-Texturen jeweils bilinear und anschließend zwischen beiden Farbwerten nochmals linear, damit auch die exakte Position des Abtastpunktes innerhalb einer Mipmap-Stufe ausgewertet wird. In der Regel sind an einer Filterung zwischen zwei Mipmaps beide Textureinheiten beteiligt.

Trilineares Filtern unterdrückt zwar jegliche Aliasing-Artefakte, neigt jedoch zu einer übermäßigen Filterung und daraus resultierender Unschärfe. So überdeckt ein nach hinten gekipptes Polygon in Y-Richtung weniger Pixel (z. B. 64 Pixel) als in X-Richtung (128 Pixel). Legt man bei der Wahl der optimalen Mipmap-Stufe die X-Richtung zugrunde, dann würde man die Originalauflösung (128 x 128) nehmen; für die Y-Richtung wäre die Auflösung 64 x 64 die ideale Wahl. Um ein Aliasing in Y-Richtung auszuschließen, entscheidet sich der 3D-Chip notwendigerweise für die 64x64-MIP-Textur, auch wenn dies bedeutet, daß das texturierte Polygon in X-Richtung an Schärfe verliert.

Dieses Problem adressiert die anisotrope (richtungsabhängige, eigentlich ungleichmäßige) Filterung, indem sie aus einer Mipmap für eine Richtung mehr Texel verwendet als für die andere Richtung. Die Abtastrichtung verläuft dabei in der Regel weder waagerecht noch senkrecht, sondern schräg in eine Vorzugsrichtung. Vor allem Texte bleiben auf diese Weise lesbar. Der Begriff `Anisotrope Filterung´ ist eine Klassifizierung und läßt Hardware-Herstellern daher Freiraum bei der Implementierung. Die trilineare Filterung stellt dagegen eine konkrete isotrope (gleichmäßige) Filtermethode dar.

Etwas weniger störend als Textur-Aliasing wirkt das Aliasing der Polygone, die der Grafikprozessor mit dem groben Pixelraster der eingestellten Bildauflösung unterabtastet. Neben gezackten Polygonkanten (`Treppchenbildung´) verursachen sehr kleine oder schmale Polygone weitere Artefakte wie blinkende Polygonfragmente, die das Pixelraster ebenfalls nicht genau genug - also auf Subpixelebene - erfaßt. Weil die darstellbare Auflösung nicht unbegrenzt erhöht werden kann, variiert Polygon-Anti-Aliasing die Pixelfarbe und verringert den Farbkontrast. Alle Hardware-Verfahren beschränken sich dabei auf Näherungslösungen, wobei man zwischen Vollbild- und Kantenverfahren unterscheidet.

Die Chip-Hersteller implementieren Anti-Aliasing entweder in Software (im Treiber) oder mit geringer Hardwareunterstützung. Beide Varianten sind mit hohen Performance- oder Qualitätseinbußen verbunden, und keine Technik erzielt befriedigende Ergebnisse: Postfilterung filtert das Originalbild und erzeugt eine übermäßige Unschärfe. Zweifaches Supersampling rendert das Bild zunächst in doppelter Auflösung in X- und Y-Richtung (vierfacher Zeitaufwand gegenüber ungefiltertem Bild) und filtert anschließend. Kantentransparenz setzt eine aufwendige Tiefenvorsortierung aller Polygone für die korrekte Darstellung voraus. Eine exzellente Bildqualität bei gleichbleibender Performance bleibt bisher speziellen Rendering-Architekturen (kachelorientierte Rasterung mit integriertem RAM) oder High-End-Systemen vorbehalten, die Anti-Aliasing mit massivem Aufwand in Hardware realisieren. (ea)

[1] Jennis Meyer-Spradow, Laß Puppen tanzen, Entwickeln mit der Programmierer-Playstation Net Yaroze, c't 18/98, S. 94

[2] Jens Dünow, Raumkreuzer, Algorithmen für 3D-Beschleuniger, c't 4/97, S. 430

[3] http://www4.tomshardware.com/releases/98q3/980729/index.html

[4] http://www4.tomshardware.com/agp-perf_2.html


Ein grundsätzliches Problem für Echtzeitgrafik stellen Bildstörungen dar, die sich aus der Dynamik der Bilder ergeben. Viele Bildfehler lassen sich bereits in einem statischen Einzelbild klar ausmachen und wären, wenn sie denn statisch blieben, noch zu akzeptieren. Einige Berechnungsfehler fallen jedoch erst im bewegten Bild unangenehm auf: In beiden Fällen sorgen unmotivierte oder plötzliche Bildänderungen, Flackern/Flimmern, Polygon- und Pixelblitze oder Sprünge für Irritationen, da das menschliche Sehsystem auf abrupte Bewegungen besonders empfindlich reagiert (Evolution: schnelle Gefahrenerkennung). Sehr viele Features (Perspektivkorrektur, Filterung) von 3D-Chips dienen allein dem Zweck, derartige Artefakte zu beseitigen oder zu reduzieren. Eine Verbesserung der Bildqualität sollte allerdings nicht zu Lasten der Geschwindigkeit gehen. Angestrebt sind kontinuierliche, weiche und konsistente Bildfolgen und ebenso ein flüssiger Bewegungsablauf mit konstanten 60 Bildern pro Sekunde (Frames per second, fps).

Das Fernsehen arbeitet ohne sichtbares Ruckeln mit lediglich 25 fps; dagegen ruckelt derselbe Film im Kino (24 fps) in Sequenzen, die schnelle Kamera- oder Objektbewegungen enthalten, weil sich die Bildfläche und damit der räumliche Abstand wesentlich vergrößert hat. Vor der Einführung des IMAX-Systems (Image Maximum) untersuchte man unter anderem die emotionale Wirkung oder Immersion, die höhere Bildraten auf einen Betrachter ausüben: Bildraten über 25 fps führen zu einer deutlichen Qualitätssteigerung; ab 50 fps beginnt die Wirkungskurve abzuflachen, und Bildraten über 60 fps erzielen nur noch marginale Verbesserungen. Man entschied sich letztendlich für 50 fps, um die Kosten für Filmmaterial und Kameratechnik nicht unnötig ansteigen zu lassen.

Filme und Computeranimationen unterscheiden sich zum einen bei der Bewegungsunschärfe, die aus der Verschlußzeit der Kamera resultiert und ein Ruckeln mildert. Zum anderen weichen in der Regel Aufnahme- und Wiedergabegeschwindigkeit, also Bildrate (3D-Chip) und Bildwiederholrate (Monitor), voneinander ab. Bei schnellen Bewegungen und kontrastreichen Bildern mit niedrigeren Bildraten scheinen Doppel- oder Mehrfachbilder dargestellt zu werden.

Spielhallenautomaten erzeugen häufig 60 fps, können diese jedoch nicht in jedem Fall garantieren, falls die Szenenkomplexität die verfügbare Rechenleistung gelegentlich übertrifft. In professionellen Flugsimulatoren muß dagegen ein Überlast-Mechanismus sicherstellen, daß die Bildrate zu keinem Zeitpunkt 60 fps unterschreitet. Die Bildrate würde sonst auf inakzeptable 30 fps absinken; die Ursache dafür ist das Double-Buffering.

Der Grafikprozessor baut in einem `unsichtbaren´ Speicherbereich (Back Buffer) ein neues Bild auf, währenddessen der RAMDAC das vorher gerenderte Bild aus einem zweiten Speicherbereich (Front Buffer) liest und auf dem Monitor anzeigt. Sind beide fertig, schaltet man die Puffer um. Das Umschalten ist nur nach einem vertikalen Synchronisationssignal (V-Sync) sinnvoll, also wenn der Monitor das Bild von oben nach unten dargestellt hat und der Elektronenstrahl zum oberen Bildanfang zurückspringt. Ansonsten würden zwei Teilbilder (neues und altes) gleichzeitig und mit einem waagerechten Sprung (tearing) dargestellt werden, was allerdings bei hohen Bildraten weniger auffällt.

Bei einer eingestellten Bildwiederholrate von 60 Hz generiert der RAMDAC jede sechzigstel Sekunde ein V-Sync-Signal. Benötigt der 3D-Chip für das Rendern eines neuen Bildes eine 59stel Sekunde und verpaßt das V-Sync Signal knapp, dann muß er auf das nächste Signal warten. Die tatsächlich angezeigte Bildrate beträgt daher lediglich 30 fps (2/60 = 1/30), bei 29 gerenderten Bildern 20 fps (3/60 = 1/20). Der Umschaltzeitpunkt und die angezeigte Bildrate bestimmen sich somit aus den ganzzahligen Teilern der eingestellten Bildwiederholrate. Mit einem Dreifachspeicher (Triple-Buffering) entfallen Wartezeit und Synchronisation, da der Chip sofort im dritten freien Buffer das nächste Bild berechnet. Die Nachteile des Tripel-Buffering sind der zusätzliche Bildspeicherbedarf und schwankende Bildraten, falls kein entsprechender Mechanismus die Bildrate konstant und gleichauf mit der Bildwiederholrate hält.

Anzeige
Anzeige