Anmelden

Schlüsseltechnologie· Staffel 1· Folge 10

STP010: 3D-Grafik

Donnerstag, 4. November 2021 · 1 h 09

MP3

Shownotes

<p>Heute geht es viel um Spiele. Denn anscheinend sind diese fast das Einzige, das Xyrill und ttimeless einfällt, wenn es um 3D-Grafik geht.
Allgemeiner dreht sich diese Folge darum, was es alles braucht, um Körper in virtuellen Welten darzustellen.
Der Abschluss der vierteiligen Reihe über Grafik, und was dazu notwendig ist.</p><h2>Shownotes</h2><ul>
<li>
<p>Vergleich zu 2D-Desktop-Grafik (STP008)</p>
<ul>
<li>Zeichenreihenfolge ist nicht so offensichtlich (Was ist vorne? Was ist hinten?)</li>
<li>höherer Anspruch an Realismus: dynamische Beleuchtung, Texturierung, etc.</li>
<li>Randbemerkung: auch 2D-Spiele werden heute meist in einer 3D-Szene aufgebaut</li>
<li>Grundeinheit für 3D-Modelle: nicht der Pixel, sondern das Polygon (deswegen kommen wir um Fließkommazahlen nicht herum)</li>
</ul>
</li>
<li>
<p>Vorbemerkungen zu den folgenden Schritten:</p>
<ul>
<li>all dies passiert für jedes Einzelbild von vorne (also bei 60Hz 60-mal pro Sekunde)</li>
<li>zur Illustration verlinken wir auf Beispielbilder aus den <a href="github.com/ssloy/tinyrenderer/wiki/Lesson-0:-g… für einen Kurs in 3D-Rendering-Grundlagen</a></li>
</ul>
</li>
<li>
<p>Schritt 1: 3D-Modell mit Polygonen</p>
<ul>
<li>Polygon heißt wörtlich "Vieleck", aber 3D-Modelle bestehen meist nur aus Dreiecken</li>
<li>Polygone mit vier und mehr Ecken können mittels <a href="de.wikipedia.org/wiki/Triangulation_(Fl%C3%A4che)">Triangulation</a> in Dreiecke zerlegt werden</li>
<li><a href="raw.githubusercontent.com/ssloy/tinyrenderer/g… eines 3D-Modells als Gitternetz</a></li>
</ul>
</li>
<li>
<p>Schritt 2: Kamera</p>
<ul>
<li>grundsätzlich ein Paar aus Blickpunkt und Blickrichtung, aber mit einigen weiteren Parametern</li>
<li>mathematische Grundlage: <a href="de.wikipedia.org/wiki/Quaternion">Quat…;
<li><a href="de.wikipedia.org/wiki/Sichtfeld">Sicht…; (<strong>Field of View</strong>): beim Menschen 130°; bei Videospielen meist weniger, je nachdem, wieviel Platz der Bildschirm im Sichtfeld einnimmt (z.B. 90° am PC, 60° an Konsolen)</li>
</ul>
</li>
<li>
<p>Schritt 3: Ausmalen der Polygone (Rasterisierung)</p>
<ul>
<li><strong>Backface Culling</strong> (Rückseiten-Auslese): wir werfen alle Polygone weg, die von uns wegzeigen</li>
<li><a href="raw.githubusercontent.com/ssloy/tinyrenderer/g… mit ausgemalten Polygonen nach Backface Culling</a></li>
<li><strong>Z-Buffer</strong>: wenn wir Polygone ausmalen, dann malen wir nur die Pixel aus, bei denen wir nicht schon Polygone gemalt haben, die näher an der Kamera dran sind</li>
<li><a href="raw.githubusercontent.com/ssloy/tinyrenderer/g… mit ausgemalten Polygonen unter Verwendung des Z-Buffers</a></li>
</ul>
</li>
<li>
<p>Schritt 4: Texturen</p>
<ul>
<li>bis jetzt war jedes Polygon einfarbig, jetzt kleben wir Bilder auf (analog zu Modellbausätzen)</li>
<li>in der Praxis ein großes Bild für das ganze Modell</li>
<li>jede Ecke jedes Polygons wird zu einem Punkt in der Textur zugeordnet</li>
<li><a href="raw.githubusercontent.com/ssloy/tinyrenderer/g… mit Polygonen, die mit ihrer Textur ausgemalt sind</a></li>
</ul>
</li>
<li>
<p>Einwurf: Was unterscheidet einen Grafikprozessor (GPU) von einem Hauptprozessor (CPU)?</p>
<ul>
<li>CPU-Kerne führen einzelne Befehle auf einzelnen Daten aus</li>
<li>GPU führt einzelne Befehle auf vielen Daten gleichzeitig aus, z.B. Rasterisierung von 10000 Polygonen gleichzeitig oder Z-Buffer-Prüfung für 10000 Pixel gleichzeitig</li>
<li>dadurch auch für andere massiv parallelisierbare Operationen interessant ("GPGPU", General Purpose GPU), z.B. wissenschaftliche Simulationen, maschinelles Lernen, Passwortknacken</li>
</ul>
</li>
<li>
<p>Schritt 5: Shader</p>
<ul>
<li>bis jetzt haben wir die <strong>Fixed Function Pipeline</strong> beschrieben, eine im GPU-Treiber fest vorgegebene Kette von Rendering-Schritten</li>
<li>neuere GPU (seit den frühen 2000ern) erlauben das Einbetten von eigenen Programmen (<strong>Shadern</strong>) in die Pipeline</li>
<li><strong>Vertex Shader</strong>: wird einmal pro Vertex (Ecke eines Polygons) aufgerufen, um die 2D-Position auf dem Bildschirm zu berechnen (ansonsten normale Berechnung anhand der konfigurierten Kameraposition)</li>
<li><strong>Fragment Shader</strong>: wird einmal pro Pixel aufgerufen, um gegebenenfalls die Farbe des Pixels zu modifizieren</li>
<li><a href="raw.githubusercontent.com/ssloy/tinyrenderer/g… eines Fragment-Shaders, der eine Farbtextur auf 6 feste Farbstufen reduziert</a></li>
</ul>
</li>
<li>
<p>Schritt 6: Beleuchtung</p>
<ul>
<li>bei traditionallen 2D-Spielen mit Sprites war Beleuchtung meist global (z.B. jedes Objekt hat 2 Sprites, einmal für dunkle und einmal für helle Szenen)</li>
<li>dynamische Beleuchtung: heute meist als Teil des Fragment Shaders</li>
<li>Beispiel: <a href="raw.githubusercontent.com/ssloy/tinyrenderer/g… Approximation einer natürlichen Beleuchtung</a>
<ul>
<li>
<ol>
<li>Anteil: ambiente Beleuchtung (überall gleich stark, Grundausleuchtung wie in einem Fernsehstudio)</li>
</ol>
</li>
<li>
<ol start="2">
<li>Anteil: diffuse Beleuchtung (abhängig davon, wie sehr die beleuchtete Fläche zur Lichtquelle hingewendet ist)</li>
</ol>
</li>
<li>
<ol start="3">
<li>Anteil: spekulare Beleuchtung (Glänzen; stark überbetont auf Flächen, die fast exakt zur Lichtquelle hingewendet sind)</li>
</ol>
</li>
</ul>
</li>
</ul>
</li>
<li>
<p>es gibt noch so viel mehr: Kantenglättung (Antialiasing), lineares und anisotropisches Filtern, Normal Mapping, Raytracing</p>
</li>
</ul>

Anmelden oder registrieren

Jetzt

0:00 / 0:00