Fachgebiet Programmiermethodik Frau Prof. Dr. Claudia Leopold Seminar Programmierung von Grafikkarten Grundlagen der 3D-Grafik Marco Sebastião Dominik Boßdorf Christian Schule Seminarbetreuer Dipl. Inf. Björn Knafla
Inhalt INHALT... 2 AUFBAU EINER GRAFIKKARTE... 3 SPEICHER-INTERFACE... 3 Accelerator Graphic Port (AGP... 3 Peripheral Component Interconnect Epress (PCIe... 3 Geschwindigkeitsvergleich:... 4 VRAM... 4 Serial access memor (SAM... 4 Dnamic random access memor (DRAM... 4 GPU... 4 BILDSPEICHERTECHNIKEN... 4 AUSSICHTEN... 5 RENDERING PIPELINE... 5 DISPLAY LISTS... 6 PIXEL-OPERATIONS UND TEXTURE ASSEMBLY... 6 PER-VERTEX OPERATIONS AND PRIMITIVE ASSEMBLY... 6 Ekurs in die 3D-Theorie... 7 Transformation im kartesischen Koordinatensstem... 7 Verschiebung ( Translation... 7 Drehung (Rotation... 7 Streckung/Stauchung (Skalierung... 8 3D Transformationen mit homogenen Koordinaten... 8 Translation:... 8 Skalierung:... 9 Rotation:... 9 Fait:... Fehler! Tetmarke nicht definiert. RASTERIZATION... 9 PER-FRAGMENT OPERATIONS... Scissor Test... Stencil Test... Alpha Test... Depthbuffer Test... FRAMEBUFFER... Colorbuffer... Stencilbuffer... Accumulationbuffer... Depthbuffer...
Aufbau einer Grafikkarte Abbildung Grundsätlicher Aufbau einer Grafikkarte Die Grafikkarte besteht aus mehreren Komponenten. Zu aller erst sei das Bus Interface erwähnt, welches eine Schnittstelle um Proessor ur Verfügung stellt. Außerdem läuft hierüber die Kommunikation um Arbeitsspeicher. Die Daten, die über den Bus ankommen werden im VRAM abgelegt oder direkt von der GPU verarbeitet. Der VRAM ist aufgeteilt in wei Speicher bereiche: Dem Bildspeicher und dem Arbeitsspeicher. Das eigentliche Bild wird vom Bildspeicher im RAMDAC in ein monitortaugliches Signal aufbereitet und im Video-Out-Controller verstärkt, um um Monitor übertragen u werden. Speicher-Interface Accelerator Graphic Port (AGP 2 Der AGP-Port ist ein speielles Interface, der durch eine architektonische Veränderung (siehe Abbildung 2 3 es ermöglichte Daten direkt mit dem Proessor und dem Arbeitsspeicher ausutauchen und die Grafik musste sich den Bus nicht mehr mit den anderen Erweiterungskarten teilen. Dies ist notwendig geworden, um den Datenhunger damals aufkommender Grafikkarten u stillen. Weiter wurde Abbildung 2 AGP-BUS der Bußtakt verdoppelt auf 66Mh und in Richtung Grafikkarte konnten bis u 8 (bei AGP 8 Datenworte pro Takt übertragen werden. Peripheral Component Interconnect Epress (PCIe 4 Im Gegensat u AGP, welches im Grunde eine direkte Weiterentwicklung u PCI darstellt ist PCIe eine vollkommene Neuentwicklung. Die Busarchitektur ist nun als Stern realisiert und die Karten sind über einen Switch angebunden, der auch die Kommunikation untereinander erlaubt. Daten werden auch nicht mehr parallel übertragen sondern seriell, was es ermöglicht (& notwendig macht den Takt deutlich u erhöhen (,25Gh. Daraus ergibt sich pro Lane (Beeichnung für eine bidirektionale serielle Verbindung ein Durchsat von 23MBte/s. Um die Bandbreite noch weiter u erhöhen kann man bis u 32 Lanes an eine PCIe Karte koppeln. Bei aktuellen Grafikkarten werden aktuell 6 benutt. Abbildung 3 PCIe-Bus
Geschwindigkeitsvergleich: PCI AGP PCIe 32 Bit 33 MBte/s 266 MBte/s 23 MBte/s 64 Bit 266 MBte/s 2 532 MBte/s 4 93 MBte/s 4,6 Gbte/s 8,9 GBte/s 8 2, GBte/s 6 3,7 GBte/s 32 7,5 GBte/s VRAM 5 Auch als dual ported RAM beeichnet. Herausragend ist hier die Fähigkeit simultane Schreibe- und Leseoperationen u ermöglichen indem man getrennte Ein- und Ausgabeleitungen nahm. Serial access memor (SAM Ist ein sequentiell aufgebauter Speicher. Die Zugriffsreihenfolge auf den Speicher erfolgt immer nach der gleichen Reihenfolge. Meist ist dieser Speichertp als Schieberegister implementiert. Die Einschränkung der nicht vorhandenen Adressierung ist auch gleicheitig sein Vorteil. Man spart dadurch Zeit, und prädestiniert ihn für den Gebrauch als Bildspeicher. Dnamic random access memor (DRAM Dieser Speicherist frei Adressierbar und wird für die Bildsnthese genutt. Des Weiteren werden hier auch Teturen & ähnliches abgelegt. GPU 6 Die GPU ist das eigentlich Herstück der Grafikkarte, sie besteht aus mehreren Einheiten in der die einelnen Operationen ausgeführt werden. Zuerst kommen die Kommando-, Tetur- und Verte- Daten in den Buffer geschrieben. Der Kommando Stream wird von der CPU ereugt und enthält Informationen darüber wie die Grafikkarte u initialisieren, also wie die internen Zustände in der GPU u setten sind (dies beeinflusst maßgeblich wie die u verarbeitenden Daten manipuliert werden und enthält Referenen u den Abbildung 4 GPU-Block-Diagramm, Geforce 6 benötigten Tetur- und Verte- Daten. Die Daten werden dann gemäß der Rendering Pipeline bearbeitet, und im Bildspeicher abgelegt. Bildspeichertechniken 7 Wie wir schon wissen hält der Bildspeicher ein digitales Abbild des Monitorbildes. Die GPU legt dort die neuen berechneten Bilder ab. Die der RAM-DAC 8, dann für den
Monitoraufbereitet. Dabei kann es u so genannten Tearing Effekten kommen. Dabei wird im oberen Bildschirmbereich ein Teil des Bildes angeeigt und im unteren bereits das nächste. Um dies u vermeiden hat man Vsnc 9 eingeführt. Hierbei hat der RAMDAC während der Aneige eklusiven Zugriff auf den Bildspeicher. Nachdem das lette Piel auf den Bildschirm geeichnet würde, kann die GPU das neue Bild im Bildspeicher ablegen. Bei besonders aufwendigen Bild-Berechnungen führt dies nun u einem starken flackern. Um dem entgegenuwirken führte man eine Doppelpufferung ein. Hierbei ist der Bildspeicher doppelt vorhanden, aufgeteilt in Front- (für den RAMDAC und Backbuffer (für den Bildaufbau der GPU. Nachdem die GPU das neue Bild aufgebaut hat wird Back- & Frontbuffer in ihrer Funktion vertaucht (Bei deaktivierten Vsnc, bei aktiviertem VSnc wird gewartet bis der RAMDAC das aktuelle Bild fertig geeichnet hat, um Tearing u vermeiden. Um den Leistungsverlust bei eingeschaltetem Vsnc u vermeiden, hat man die Dreifachbufferung eingeführt. Hierbei hat die GPU noch einen weiten Backpuffer ur Verfügung, in dem er die Berechnung des nächsten Bildes beginnen kann, ohne auf das Vsnc u warten. Bei diesem Verfahren treten keine (bw. kaum Leistungsverluste auf. Aussichten Die Leistung der CPU steigt ureit um 7%, die des Video-Speichers um 25, und die Lateneiten des Speichers sinken um 5%. Da man davon ausgehen kann das diese Größenordnung auch in Zukunft so bleibt. Sprich die Leistung der GPU schneller unimmt, als die Fähigkeiten des Speichers, muss man dafür sorgen, das Zugriffe auf den Speicher minimiert werden. Daraus folgt dass das heute eingesette Streamingmodel (aufbauend auf Pipelining immer wichtiger wird. Hierbei gibt es wei Grundparadigmen: Kernel (ein auf eine speielle Aufgabe optimierter Kern und Streams (Daten werden von einem Kernel um nächsten weitergereicht um eterne Speicherugriffe u minimieren. Rendering Pipeline 2 Nachdem wir nun den grundsätlichen Aufbau einer Grafikkarte gesehen haben, werden wir uns nun dem eigentlichen 3-D Verarbeitung uwenden. Das Rendern geschieht in der Rendering Pipeline die wir uns im Detail ansehen werden. Als Beispiel werden wir im Folgendem die OpenGL Rendering Pipeline nehmen.opengl stellt eine Programmierschnittstelle ur Hardware dar und wird heututage von allen Grafikkarten unterstütt. Entwickelt wurde OpenGL von SGI auf Basis von IRIXGL und wird heute durch das Architekture-Review-Board verwaltet, welchem viele wichtigen Unternehmen der IT- Branche angehören. Bei OpenGL handelt es sich um einen Zustandsautomaten, was im Grunde einfach bedeutet, dass man Zustände hat die man an- und abschalten kann. Wenn ein solcher Zustand, repräsentiert durch eine Zustandsvariable, einmal eingeschaltet ist, bleibt er so lange bestehen, bis man ihn epliit ändert. Als Beispiel für solch einen Zustand kann man.b. die aktuelle Farbe nehmen. Hat man in einer Zeile Code die Farbe geändert, so wird von diesem Punkt an jeder weitere Punkt in dieser Farbe geeichnet, solange bis man die Zustandsvariable wieder ändert.
In der Abbildung unten sieht man nun eine schematische Abbildung dieser Pipeline, die wir nun Schritt für Schritt durchgehen werden. Abbildung 5 3 Renderingpipeline Als Ausgangsdaten für den Weg durch die Pipeline besteht unächst einmal ein Unterschied wischen Pieldaten und Vertedaten. Als Pieldaten beeichnet man Bilder oder Piel, als Verte-Daten geometrische Daten wie um Beispiel Linien oder Polgone, die durch ihre Eckpunkte (verticles beschrieben werden. Beide Tpen von Ausgangsdaten gehen unächst ihre eigenen Wege, bei Piel Daten den Weg der Pielpipeline, bei geometrische Daten den der Geometriepipeline, bis sie auf der Stufe der Rasteriation wieder usammentreffen. Displa lists Wie die Grafik veranschaulicht, gibt es 2 Wege, die die Piel- und Vertedaten gehen können. Entweder sie gehen jeweils direkt in ihre jeweilige Stufe der Pipeline, oder sie machen einen Umweg über die Displa-List. Displalists dienen im Grunde als Zwischenspeicher für OpenGL-Befehle. So können diese um Beispiel wieder verwendet werden. Wenn die Displalists nicht verwendet werden, spricht man vom immediate-mode Piel-operations und Teture assembl Die nächste Stufe der Pipeline, den die Pieldaten erreichen, ist die Stufe der Piel operationen. Hier werden die Pieldaten entpackt und eventuell skaliert um dann in der Stufe der Teturen assembl schließlich als Tetur- Objekt gespeichert u werden. Per-verte operations and primitive assembl Für diesen Schritt der Pipeline bietet sich um besseren Verständnis das in [] genutte Beispiel der Kamera-Analogie u Benuten. Was im Wesentlichen in diesem Schritt der Pipeline passiert, lässt sich in 4 Schritten beschreiben. Zu Anfang wird das uvor durch Geometriedaten beschriebene Objekt in der Sene positioniert und die Kamera eingerichtet. Das gane geschieht mit Hilfe von Matrioperationen wie Translation, Rotation und Skalierung. Diese Operationen werden in
der Modelview Matri gespeichert, Als Ergebnis dieses Schrittes erhält man die sog. Ee- Coordinates. Als nächster Schritt findet die Projektion statt. Am Beispiel der Kamera kann man sich diesen Schritt als die Wahl der Kameralinse vorstellen. Die Projektion-Matri legt die Form der so genannten viewing-volume fest. Hier wird, einfach ausgedrückt, alles abgeschnitten, was nicht im Sichtbereich der Kamera liegt. Diese Bereiche werden durch 6 Clipping-planes beschrieben. Des Weiteren wird in dieser Stufe beschrieben, wie die Objekte auf den Bildschirm gebracht werden. Im Wesentlichen stellt OpenGL wei Tpen von Projektionen bereit. Zum einen perspective projection, in der Objekte, die sich weiter von der Kamera entfernt befinden, perspektivisch korrekt kleiner dargestellt werden, um Anderen gibt es noch die orthographic projektion, wo sich die Größe der Objekte mit wachsender Entfernung nicht ändert. Als Ergebnis dieser Stufe erhalten wir Clipping Koordinaten. Nun folgen noch die Schritte Perspective Division um die Koordinaten u normalisieren und schließlich die Viewport Transformation, in welcher der Zeichenbereich definiert wird. Abbildung 6 4 Geometriepipeline Ekurs in die 3D-Theorie 5 Transformation im kartesischen Koordinatensstem Verschiebung ( Translation Der Punkt P (,, soll um den Vektor a r ( a, a, a in den Punkt P (,, verschoben werden. Bei der Verschiebung wird jeder Komponente des Punktes P der entsprechende Wert im Vektor a r hin u addiert. P P + ar ( + a, + a, + a Drehung (Rotation Sei Q ein Punkt im kartesischen Koordinatensstem. Eine Transformation Rot q ( θ, die jedem Punkt P des Koordinatensstems einen Punkt P uweist, so dass die Gerade QP und QP den Winkel θ einschließen heißt Rotation um Q. Ein positiver Wert für θ steht für eine Rotation gegen den Uhreigersinn, eine negativer Wert mit dem Uhreigersinn. Wir betrachten hier uerst die Rotation um den Ursprung im 2-dimensonialen kartesischen Koordinatensstem. Die Linie vom Ursprung u Punkt P hat einen Winkel φ ur Achse
( siehe Abbildung. Ist r der Abstand von P und P um Ursprung, dann gilt: P (, ( r * cos (φ, r * sin (φ ; P (, ( r * θ + φ, r * θ + φ Mit dem Additionstheoremen für Cosinus und Sinus sin ( +β β+ β ; cos ( + β β β erhält man: r * θ * φ r * θ * φ * θ * φ r * θ * φ + r * θ * φ * θ + * φ Die ugehörige Transformationsmatri ( Rotationsmatri ist: cos Θ Rot ( Θ sin Θ sin Θ cos Θ P P Streckung/Stauchung (Skalierung Der Punkt P (,, soll um den Vektor sr ( s, s, s skaliert werden. Die Skalierung ähnelt der Multiplikation eines Vektors mit einem Skalar. Hier kann jedoch der Faktor mit dem jeweils die Komponenten multipliiert werden unterschiedlich sein. Eine Skalierung mit einem Faktor s > ergibt eine Vergrößerung, ein Faktor s < aber > ergibt eine Verkleinerung. Wenn der Faktor s < wird, ergibt sich eine Spiegelung am Ursprung. In diesem Fall ergibt eine Faktor s < - eine Vergrößerung und ein Faktor s < aber > - eine Verkleinerung. s P ( * s, * s, * s ; s s θ φ Die oben beschriebenen Transformationen erfüllen ihren Zweck wenn es darum geht einelne Veränderung auf grafische Objekte anuwenden. Jedoch sind damit nur einfache Verschiebungen und Transformationen um festgelegte Bestandteile des Koordinatensstems, also Ursprung und Koordinatenachsen, möglich. Selbst wenn eine einfache Translation mit einer anderen Transformation, um Beispiel einer Drehung, verketten werden soll, ist eine Addition und eine Multiplikation nötig, welche nicht in einer Matri usammengefasst werden können. Dies führ dau das Operationen wie die Drehung um eine beliebige Achse nicht in einer Matri kombinierbar sind. 3D Transformationen mit homogenen Koordinaten Translation:
Die Verschiebung eines Punktes P(,, um den Translationsvektor T(t,t,t ergibt sich in Matrischreibweise: Hierbei gilt wei hintereinander ausgeführte Translationen sind additiv. Skalierung:. Eine Streckung bw. Stauchung (Skalierung mit den Faktoren s,s,s kann durch folgende Matrimultiplikation durchgeführt werden: Ist ein Skalierungsfaktor kleiner, dann wird eine Stauchung entlang der betreffenden Achse durchgeführt. Wenn der Skalierungsfaktor größer als ist wird eine Vergrößerung durchgeführt. Zwei aufeinander folgende Skalierungen sind multiplikativ. Rotation: Im rechtshändigen Koordinatensstem ergeben sich abhängig von der Achse folgende Rotationsmatien: Drehung um die Achse: Drehung um die Achse: Drehung um die Achse: Die Vorteile von homogenen Koordinaten liegen um einen in der einfachen Möglichkeit verschieden Transformationen durch Multiplikation der einelnen Matrien durchuführen, wie auch in der Möglichkeit diese in relativ einfacher in Hardware u realisieren, weil man nicht mehr wischen Addition und Multiplikation unterscheiden muß. Rasteriation In dieser Stufe der Pipeline werden Pieldaten und Geometriedaten in Fragmente umgewandelt. Ein Fragment entspricht der rechteckigen Fläche eines Piels im Frambuffer. Jedes Fragment enthält Informationen über die jeweilige Position, Farbe, Alphawert und Tiefenwert (-wert. Auch werden hier die verticles u Linien verbunden und Flächen gefüllt. s s s t t t
Per-fragment operations Nachdem alle Objekte nun als Fragmente vorliegen, werden schließlich verschiedene Operationen auf diese Fragmente angewendet und außerdem können noch verschiedene Tests durchlaufen werden. Alle Operationen und Tests dieser Stufe können wiederum vom Programmierer epliit ein- und ausgeschaltet werden. Zum einen werden nun Nebeleffekte in die Fragmente eingerechnet. Einfach ausgedrückt bekommen vom Betrachter weiter entfernte Fragmente einfach mehr grau mit eingemischt als weiter vorne liegende. Des Weiteren werden eventuelle Teturen aus der Teture-assembl gelesen die Farbwerte der Fragmente angeglichen. Nun werden auf die Fragmente noch folgende Tests durchgeführt, bevor sie endlich im Colorbuffer geschrieben werden. Scissor Test Hierbei kann ein rechteckiger Bereich in der Ausgabe definiert werden, in dem nicht geeichnet werden soll. Liegt ein Fragment innerhalb dieses Bereiches, wird es verworfen. Stencil Test Der Stencil-Test ist im Wesentlichen eine erweiterte Form des Scissor Tests, bei dem der Bereich nicht Rechteckig ist, sondern durch eine globale Bitmaske definiert wird. Alpha Test Fragmente werden anhand ihres Transparen-Wertes im Vergleich u einem Referenwert verworfen oder nicht. Depthbuffer Test Hier werden die Tiefenwerte (-Werte der Fragmente verglichen. Das ist wichtig, um die Sichtbarkeit von Objekten u testen. Dadurch werden weiter im Raum liegende Fragmente, die von davor liegenden Fragmenten verdeckt werden, verworfen. Framebuffer Der OpenGL Frambuffer besteht aus 4 Puffern, wobei der Betrachter am Ende eigentlich nur die Farbinformationen u Gesicht bekommt, die im Colorbuffer gespeichert werden. Colorbuffer Die Farb- und Alpha-Werte werden hier für jedes Fragment gespeichert. Stencilbuffer Informationen ur Maskierung der einelnen Fragmente. Accumulationbuffer Erweiterter Colorbuffer in den allerdings nicht direkt geschrieben werden kann. Kann benutt werden um beispielsweise Effekte wie Antialising oder Tiefenunschärfe u realisieren. Depthbuffer Tiefeninformationen u jedem Fragment.
http://www.elektronik-kompendium.de/sites/com/bilder/569.gif 2 http://www.elektronik-kompendium.de/sites/com/323.htm 3 http://www.elektronik-kompendium.de/sites/com/bilder/323.gif 4 http://www.elektronik-kompendium.de/sites/com/945.htm 5 http://de.wikipedia.org/wiki/vram 6 GPUGems 2, Matt Pharr & man others ; Kapitel 29 & Kapitel 3 7 http://de.wikipedia.org/wiki/dreifachpufferung 8 http://www.gotfrag.com/portal/stor/29627/ 9 http://de.wikipedia.org/wiki/vsnc http://de.wikipedia.org/wiki/doppelpufferung http://de.wikipedia.org/wiki/dreifachpufferung 2 OpenGL Programming Guide; Fifth edition; b OpenGL Architecture Review Board 3 http://www.cs.kent.edu/~farrell/graphics/opengl/openglprog.2/opengl/render.html 4 http://www.opengl.org/documentation/red_book/ 5 Lehrbuch der Grafikprogrammierung; Klaus Zeppenfeld; Kapitel; Lehreinheit 3 & 4