Vorlesung 9
This commit is contained in:
parent
76d14aa7fe
commit
f35e352d03
BIN
Assets/Computergrafik-Renderpipeline-primitive.png
Normal file
BIN
Assets/Computergrafik-Renderpipeline-primitive.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 128 KiB |
BIN
Assets/Computergrafik_GPU_Hardware.png
Normal file
BIN
Assets/Computergrafik_GPU_Hardware.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 110 KiB |
@ -1956,3 +1956,105 @@ Perspektive Shadow-Map
|
||||
- Beim Abtasten (Rekonstruktion):Trilineare Filterung in x, y, und k (Mip-Map-Stufe)
|
||||
- Texturinhalt als Material, Beleuchtung, Geometrie interpretiert
|
||||
|
||||
# Grafik (GPU) Pipeline
|
||||
- algorithmisches Konzept, sowie Realisierung der Grafikkartenhardware ist vergleichbar mit Fließband
|
||||
- spezialisierte Arbeitsstationen (Spezialprozessoren)
|
||||
- jedes geometrische Objekt durchläuft Arbeitsstationen sequenziell
|
||||
- Arbeitsschritte können dadurch gleichzeitig auf verschiedenen Daten ausgeführt werden
|
||||
|
||||
## Bestandteile
|
||||
Programm API -> Treiber -> Vertex-Verarbeitung -> Primitivenbehandlung -> Rasterisierung & Interpolation -> Fragment Verarbeitung -> Rasteroperation -> Bildspeicher
|
||||
|
||||
## Allgemeines
|
||||
- Anwendungsprogramm:
|
||||
- läuft auf der CPU,
|
||||
- definiert Daten und Befehlsabfolge,
|
||||
- greift dazu über das Grafik-API (Application Programming Interface, z. B. OpenGL, Direct3D) auf die Grafikkarte zu
|
||||
- Treiber: übersetzt die Grafikbefehle des Programms in die Maschinensprache der speziellen Grafikhardware (Graphics Processing Unit / GPU, z.B. von nVidia, AMD oder Intel)
|
||||
- Befehle und Daten werden über den Bus (z.B. PCI-Express) von der CPU auf die GPU übertragen
|
||||
- OpenGL-Pipeline: Abarbeitung der Grafikbefehle auf der GPU
|
||||
- Ausgabe des Bildspeichers auf dem Monitor
|
||||
- typischer OpenGL "Draw"-Befehl (im Anwendungsprogramm via OpenGL-API aufgerufen)
|
||||
```bash
|
||||
glBegin(GL Polygon);
|
||||
glVertex3f (1.0, 1.0, 0.0);
|
||||
glVertex3f (0.0, 1.0, 0.0);
|
||||
...
|
||||
glEnd();
|
||||
```
|
||||
- Treiber schickt Daten/Befehle an die GPU (z. B. via PCIe -Bus)
|
||||
- Funktionsausführung auf der GPU ist dann abhängig vom aktuellen Zustand (OpenGL State Machine bzw. den gewählten Shadern):
|
||||
- z. B. vorher definierter Primitivtyp (hier GL Polygon), Transformation, Lichtquellen, Interpolationsart (z.B. Gouraud Shading vs. Flat Shading)
|
||||
|
||||
Abarbeitungsreihenfolge auf der GPU:
|
||||
- Empfangen der Vertices in einer geordneten Sequenz.
|
||||
- Vertexverarbeitung via Vertex Shader. Jeder Input-Vertex im Datenstrom wird in einen Output-Vertex transformiert und beleuchtet.
|
||||
- Primitive culling (Verwerfen wenn nicht sichtbar) und clipping (Abschneiden der Polygone am Rand)
|
||||
- Rasterkonvertierung (Polygon Filling) und Interpolation der Attributwerte (x-Koordinate, 1/z, R, G, B, Texturkoordinaten u/v, ...)
|
||||
- Die Daten jedes Fragmentes (Pixel/Subpixel) wird mit einem Fragment Shader verarbeitet. Zu jedem Fragment gehört eine Anzahl Attribute.
|
||||
- Per-Sample Operationen: Blending (Alpha-Blending bei Transparenz), Tiefen- und Stencil- Operationen ...
|
||||
|
||||
|
||||
## Vertex-Verarbeitung
|
||||
- Transformationen:
|
||||
- Modell-Transformation, Kamera-Transformation (Model View Matrix) → Matrixmultiplikationen → Skalarprodukt
|
||||
- Beleuchtung (Lighting):
|
||||
- Lichtquellen, diffuses & spekuläres Material: (Gouraud Shading) Lambert, Phong-Modell → Skalarprodukt
|
||||
- Skalarprodukte (Gleitkomma-Multiplikationen und Additionen) werden durch viele parallele Prozessoren auf der GPU effizient verarbeitet.
|
||||
|
||||
## Primitive & Primitivenbehandlung
|
||||

|
||||
|
||||
## Rasterkonvertierung
|
||||
- Edge Tables bereits erzeugt (Polygonsetup in Primitivenbeh.)
|
||||
- Rasterkonvertierung/Interpolation entspricht der Scan-Line-Konvertierung (s. Polygonfüllalgoritmus), generiert Pixel (Fragments)
|
||||
- Interpolation der x-Werte der Kanten (siehe left edge scan /bzw. right edge scan)
|
||||
- pro Scan Line: inkrementiere x-Wert (left edge, right edge) (OpenGL behandelt nur konvexe Polygone/Dreiecke – d. h. immer 2 Kanten pro Bildzeile!)
|
||||
- lineare Interpolation weiterer Attribute:
|
||||
- z (1/z)-Werte,
|
||||
- RGB-Werte (Gouraud Shading),
|
||||
- Texturkoordinaten u/v (affines Texturmapping),
|
||||
- Normalen (Phong Shading)
|
||||
- sehr wenige Ganzzahloperationen pro Pixel/Bildzeile
|
||||
- Ausnahmen: z. B. perspektivische Texture Maps (FP-Division!)
|
||||
|
||||
|
||||
## Fragment-Verarbeitung
|
||||
Weiterverarbeitung auf Basis der interpolierten Attribute im Fragment Shader
|
||||
|
||||
Beispiel: Phong-Shading
|
||||
- Berechnung des Phong-Beleuchtungsmodells auf Basis der vorher linear interpolierten Fragmentnormalen, -position und Materialdaten sowie der Daten der Lichtquellen und Kameraposition
|
||||
|
||||
## Rasteroperationen
|
||||
- Abschließende Auswahl/Zusammenfassung der berechneten Fragmentdaten (pro Pixel)
|
||||
- Beispiel: nicht transparente Objekte, Übernahme der Farbwerte mit z-Position, welche am dichtesten an der Kamera ist (z-Buffer)
|
||||
- Beispiel:
|
||||
- transparente Objekte (z.B. Glashaus), lineares Blending zwischen schon existierenden Farbwerten und neuesten entsprechend der Transparenz
|
||||
- z.B. 40% Transparenz (bzw. 60% Opakheit) für rotes Quadrat $\begin{pmatrix} R & G & B \end{pmatrix} = \begin{pmatrix} 0,6*1+0,4*0 & 0,6*0+0,4*0 & 0,6*0+0,4*1 \end{pmatrix} = \begin{pmatrix} 0,6 & 0 & 0,4 \end{pmatrix}$
|
||||
|
||||
|
||||
## Performance
|
||||
Einfaches Modell zur Bestimmung der Rechenzeit T:
|
||||
$T = a * \text{Anzahl Vertices} + b * \text{Anzahl Bildpixel}$ (a = Aufwand pro Vertex, b = Aufwand pro Pixel)
|
||||
|
||||
- Grafikkarten geben ihre Performance an in:
|
||||
- Anzahl Polygone / Sekunde (Polygone mit kleiner Pixelanzahl)
|
||||
- Anzahl verarbeitete Pixel / Sekunde
|
||||
- z.B. ca. 100 Millionen Polygone/sec à 10 Pixel / Polygon (mit Texturen, tri-lineare Filterung, etc. mehrere Milliarden Pixel / s (Gouraud Shader) (Angaben: nVidia Geforce 6800 - Jahr 2005)
|
||||
- Problem der Grafik-Pipeline: Flaschenhals! - Langsamste Operation hält Pipeline auf (bestimmt Durchsatz) → Zwei extreme Situationen:
|
||||
- Vertex-limited: viele Vertices, kleine Polygone (wenige Pixel), einfache lineare Interpolation der Vertex-Attribute pro Fragment (kleines b )
|
||||
- Fill rate limited: anspruchsvolle Fragment-Shader (großes b), weniger dafür große Polygone (viele Pixel)
|
||||
- Außerdem: Grafikspeicher-Zugriffe sind teuer (Latenz und Bandbreite beachten!) z.B. Auslesen gerenderter Bilder aus dem Grafikspeicher
|
||||
- Eine für die Grafikkarte angegebene Performance (z. B. 100 Mio Polygone/sec bei G-Force 6800) ist nur unter unrealistisch günstigen Bedingungen zu erreichen.
|
||||
- d. h. z.B. nicht 100 Mio. unterschiedliche Polygone mit 1 fps (wegen Speicherbandbreite für Vertexzugriffe)
|
||||
- auch nicht 10.000 Polygone mit 10.000 fps (da Framebuffer-Reset teuer)
|
||||
- Herstellerangaben gelten nur unter optimalen Bedingungen (z. B. 10 Pixel / projiziertem Polygon)!
|
||||
- realistisch (verschieden große Polygone) → ca. 1 Mio Polygone mit 10 fps (10 Mio Polygone/s) = 10% der Peak Performance!
|
||||
|
||||
$$\text{Durchsatz (fps)} \approx \text{Konst.} / \text{Polygonanzahl}$$
|
||||
- unter realitischem Durchsatz: Begrenzung durch Bildspeicher
|
||||
- über realisitschem Durchsatz: Begrenzung durch Geometriespeicher
|
||||
|
||||
## Hardware-Architektur
|
||||

|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user