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