SAE Realtime Rendering

Kapitel 7 Rendering realtime

Kapitel 7 Rendering realtime


Rui Bosei
Diese Lernkarten bieten einen umfassenden Einblick in die Grundlagen des Realtime Renderings und sind ideal für Mittelschüler geeignet. Sie behandeln wichtige Konzepte wie Shader, Texturen, Pixel- und Vertex-Lit, sowie Techniken wie Occlusion Culling, Batching und Shadow Mapping. Die Karteikarten erklären auch die Verwendung von Lightmaps, Level of Detail (LOD) und Modular Assets, die für die Optimierung von Rendering-Prozessen essenziell sind. Sie richten sich an angehende Grafikprogrammierer und Entwickler, die ihre Kenntnisse in der Echtzeit-Rendertechnik vertiefen möchten.
Cartes-fiches
32
Utilisateurs
1
Langue
Allemand
Catégorie
Informatique
Niveau
Collège
Créé / Mis à jour
28.09.2014 / 29.09.2014

Cartes-fiches

Graphics Pipeline

Graphics Pipeline beinhaltet die benötigten Schritte um ein dreidimensionales Bild auf einen zweidimensionalen Monitor zu übertragen. Das Hauptziel dabei ist, ein photorealistisches Rendering in Echtzeit zu ermöglichen.

Rasterization

Rasterization wird der Prozess genannt, bei dem die Repräsentation des 2D Bildbereiches in ein Rasterformat konvertiert und die korrekten Pixelwerte für jedes Triangle bestimmt werden (diese nennt man auch Fragments). Jede folgende Operation wird anschliessend für jeden einzelnen Pixel ausgeführt. Dies nennt sich dann Pixel Pipeline und beinhaltet mehrere sehr komplexe Einzelschritte.

Vertex & Fragment-Shader

Ein Vertex & Fragment-Shader, auch genannt Pixel Shader, ist ein weiterer Schritt der Graphics Pipeline. Dabei werden die Texturen und finalen Farben den einzelnen Fragments zugewiesen. Hinzu kommt ein programmierbarer Pixel Shader, welcher der Applikation ermöglicht, Pixel Attribute wie Color, Depth und Position auf dem Monitor zu kombinieren. Dies geschieht unter Berücksichtigung der Texturen und ermöglicht so die Generierung von eigenen Shading Effects.

Framebuffer

Der Framebuffer ist die letzte Instanz auf der Grafikkarte. Hier wird das Bild zusammengefügt und an den Monitor übertragen. Zusätzlich speichert der Framebuffer die genaue Anzahl der gleichzeitig auf dem Bildschirm angezeigten Farben oder Farbnuancen. Die grösse des Framebuffers wird durch das Pixelformat (Color Depth) und der Resolution bestimmt.

Draw Calls

Um ein Objekt auf dem Bildschirm darstellen zu können, erteilt die Engine einen Befehl zur Ausführung eines Draw Calls an die Grafik API (Bsp. OpenGL oder Direct3D). Die Grafik API übernimmt die Arbeit für jeden einzelnen Draw Call. Wenn während der Laufzeit eine Anzahl von Objekten als einzelner Draw Call dargestellt wird, nennt man dies Draw Call Batching. Es können jedoch nur Objekte mit demselben Material/Textur zusammen gezeichnet werden. Das heisst umso höher die Anzahl an Materials und Texturen desto höher die benötigten Draw Calls. Wenn verschiedene Texturen für ein einzelnes Objekt verwendet werden müssen, ist durch ein Texture Atlas die Draw Call Anzahl auf 1 minimierbar.

Texture Memory

Texture Memory ist eine Art digitaler Speicher, der die Texturdaten für den Rendering Prozess im GPU verfügbar macht. Es wird meist als spezialisierter RAM Speicher implementiert, was einen schnelle Lese -und Schreibgeschwindigkeit ermöglicht. Dadurch ist es der Grafikhardware möglich die Leistung im Rendern von 3D Daten zu erhöhen.

Clipping

Clipping beseitigt die Teile eines Bildes, die auf dem Monitor nicht sichtbar sind. Dies sind unter anderem Objekte, welche durch andere verdeckt werden, von der Camera abgewandte Teile von Objekten (Rückseiten) und Bereiche die durch die Applikation abgedeckt sind. Ein wichtiger Begriff dazu ist ausserdem Clipping Plane. Hierbei aktiviert man zwei imaginäre Planes (Near & Far Clipping Plane), die man an zwei definierbaren Abständen zur Camera platziert. Nun werden nur die Objekte zwischen diesen Planes gerendert.

Graphics Optimization

Typical bottlenecks and ways to check for them:

  • GPU is often limited by fillrate or memory bandwidth.
    • Does running the game at lower display resolution make it faster? If so, you’re most likely limited by fillrate on the GPU.
  • CPU is often limited by the number of things that need to be rendered, also known as “draw calls”.
    • Check “draw calls” in Rendering Statistics window; if it’s more than several thousand (for PCs) or several hundred (for mobile), then you might want to optimize the object count.

Polygon Budget

Das Polygon Budget beschreibt die Anzahl möglicher Polygone/Triangles, welche gleichzeitig, unter Berücksichtigung einiger Bedingungen auf dem Screen dargestellt werden sollen. Allerdings gibt es kein allgemein gültiges Grundrezept, wie viele Polygone/Triangles verwendet werden dürfen. Denn dies ist abhängig von der Zielplattform/Hardware (PC, Mobile, Konsole usw.), dem Stil des Games, Anzahl gleichzeitig dargestellter Charaktere, die visuelle Komplexität der Umgebung, die visuelle Komplexität der Charaktere, die gewünschte Anzahl fps u.v.m. Deshalb muss es eigentlich immer ausprobiert werden. Wichtig hierbei ist nicht nur die eigene Hardware, sondern die Zielhardware zu verwenden. Daher es zudem einfacher ist die Anzahl der Polygone zu erhöhen, anstelle sie zu reduzieren, empfiehlt es sich, eher mit geringeren Anzahlen anzufangen. Hinzu kommt dass nicht nur das Polygon Budget für die allgemeine Performance verantwortlich ist, sondern auch die angewendeten Texturen/ Materials usw.

Diffuse

Diffuse berechnet ein simples Lambertian lighting model (Deutsch: Beleuchtungsmodell). Die Beleuchtungintensität auf der Oberfläche nimmt ab, wenn der Winkel zwischen dem Objekt und der Lichtquelle verringert wird. Ausserdem ist die Beleuchtungsintensität nur von diesem Winkel abhängig und wird nicht durch die Camera Verschiebung/Rotation beeinflusst. Generell ist dies ein einfach zu berechnender Shader.

Decal

Der Decal Shader ist eine Variation des Vertex-Lit Shaders. Das gesamte Licht wird in diesem Shader als vertex lights gerendert. Zusätzlich zur Haupttextur, kann mit Decal eine zweite Textur verwendet werden um zusätzliche Details zu erstellen. Die zweite Textur sollte jedoch mit einem Alpha-Kanal ausgerüstet sein, damit die sichtbaren Bereiche bestimmt werden können.

Specular

Specular berechnet wie der Diffuse Shader ein simples Lambertian lighting model (Deutsch: Beleuchtungsmodell). Allerdings kommt bei Specular ein Blickwinkel abhängiges specular highlight (Deutsch: Glanzlicht) hinzu. Das nennt sich das Blinn-Phong lighting model. Das specular highlight wird durch den surface angle (Deutsch: Flächenwinkel), den light angle (Deutsch: Leuchtwinkel) und dem Betrachtungswinkel gesteuert. Mit der Shininess (Deutsch: Glanz) kann die Unschärfe des specular highlight eingestellt werden. Dieser Shader ist eher teuer im Bezug auf die Renderzeit.

Normal

Unter Normal gehören alle Shader, die in Kombination mit einer Normal-Map angewendet werden. Diese Shader heissen in Unity allerdings bumped (Bsp. Bumped Specular, Transparent Bumped Diffuse usw.).

Parallax

Parallax sind Shader, welche zusammen mit einer Normal-Map und einer Heightmap verwendet werden. Im Gegensatz zu einem gewöhnlichen Normal Shader, erzeugt ein Parallax Shader eine bessere Tiefen-Simulation. Die extra Tiefeninformation wird dabei aus der verknüpften Heightmap gewonnen. Diese kann man beispielsweie aus dem Alpha-Kanal der Normal-Map generieren. Die Parallax Shader können in Kombination mit [[Diffuse], Specular, Transparent, Self-Illuminated und Reflective Shadern angewendet werden. Dieser Gewinn verlängert allerdings auch die Renderzeit.

Transparent

Die Transparent Shader werden für voll -oder teil durchsichtige Objekte verwendet. Mit dem Alpha Kanal der Haupttexutur wird eingestellt, welche Bereiche mehr oder weniger transparent als andere sein sollen. Dieser Shader kann ausserdem in Kombination mit anderen Shadern verwendet werden (Bsp. Vertex-Lit, Diffuse, Specular, Normal usw.).

Reflective

Reflective Shader werden in Kombination mit einer Cube Map verwendet. Die Cube Map bestimmt die zu reflektierende Umgebung. Zudem hat man durch den Alpha-Kanal der Haupttextur die Möglichkeit einzustellen, wie stark gewisse Bereiche des Objektes reflektieren sollen. Eine hohe reflectivity (Deutsch: Reflexionsvermögen) eignet sich beispielsweise sehr gut für Öl, Chrom usw. während eine niedrige reflectivity bei Metall-Effekten oder flüssigen Objekten zum Einsatz kommen kann. Reflective kann wie andere Shader in Kombination angewendet werden. (Bsp. Reflective Vertex-Lit, Reflective Diffuse usw.)

Self-Illuminated

Die Self-Illuminated Shader eignen sich für aus Eigenkraft leuchtende Objekte (Bsp. Monitore, Lichterketten usw.). Das Licht wird durch den verknüpften Alpha-Kanal emittiert und benötigt keine andere Lichtquelle. Zusätzliche Vertex Lights oder Pixel Lights werden zur Self-Illumination addiert. Dies ermöglicht die Simulation von Lichtquellen ohne Basic 3D Lights, was einen positiven Einfluss auf die Renderzeit hat. Wie andere Shader können auch Self-Illuminated Shader in Kombination genutzt werden.

Cube Map

Eine Cube Map ist eine Kollektion aus sechs verschiedenen quadratischen Texturen. Diese werden dann auf die sechs Seiten eines imaginären Würfels platziert. Cube Maps werden meist für Reflective Shader verwendet um Reflektionen zu simulieren oder für sogenannte Skyboxes, welche einen weit entfernten Hintergrund darstellen.

Blend Shader

Blend Shader können verwendet werden um zwei Shader übereinander zu blenden. Dies erlaubt interessante Effekte. Allerdings gibt es in Unity keinen Standard Blend Shader, deshalb müsste dieser selbst programmiert oder aus dem Asset Store heruntergeladen werden.

Fresnel

Bei einem Fresnel Shader ist die Intensität der Reflektionen, des Glanzes oder anderer Attribute abhängig vom Blickwinkel. Dieser Effekt wird gesteuert über die Ausrichtung der Normals. Beispielsweise könnte man bei einem Fresnel Shader eine Farbe vergeben, die auf der Oberfläche erscheint, wo die Normals zur Camera ausgerichtet sind und eine andere für die Normals, die von der Camera abgewandt sind. Das heisst es lässt sich mit einem Fresnel Shader neben der Specularity und Reflectivity auch die Color und Transparency steuern.

Custom Shader

Ein Custom Shader ist ein eigens programmierter Shader, welcher Eigenschaften ermöglicht, die durch Standard Shader nicht erreicht werden können. Dies benötigt allerdings Kentnisse in der Shader Programmierung.

 

Texture Compression

Bei der Texture Compression geht es um die Reduzierung der Dateigrösse von Texturen oder um deren Optimierung für bestimmte Hardware. Das Texture Format bestimmt die Menge an Bytes, die in die Memory geschrieben werden. Dieser Verbrauch wird in bpp (Bytes per Pixel) angegeben. Deshalb sollte man abhängig von der Zielhardware die entsprechenden Texture Formats wählen. Komprimierbar sind ausserdem importierte Meshes und Animations.

Texture Atlas

Die hohen Kosten durch das gleichzeitige Darstellen von bis zu tausenden Objekten ist eines der grössten Probleme in heutigen Videogames. Das grösste Problem dabei ist, das jedes dieser Objekte, egal wie simpel es sein mag, eine eigene Textur benötigt. Die performantere Lösung ist deshalb ein Texture Atlas. Ein Texture Atlas ist eine riesige Textur, welche aus vielen verschiedenen Texturen besteht. Hierfür wird das UV in ein quadratisches Raster unterteilt und in jedem dieser Quadrate liegt dann eine Textur. Ein gewöhnlicher Texture Atlas beinhaltet ca. 16-256 einzelne Texturen.

Modular Assets

Modular Assets (Deutsch: modular - aus Elementen zusammengesetzt) kommen oft im Level Design zur Anwendung. Im Prinzip sind es Objekte, welche im "Baukastenformat" organisiert werden. Das heisst man kann die gleichen Objekte verwenden um verschiedenste Gebilde zu konstruieren. Man könnte es sich auch als Lego-Baukasten vorstellen. Für die Anwendung von Modular Assets benötigt es eine sehr genaue und durchdachte Planung.

Level of Detail (LOD)

Level of Detail (LOD) oder LOD Meshes beschreibt eine Technik, welche vor allem im realtime Rendering Performance Einsparungen verspricht. Grundsätzlich erstellt man von seinem Objekt verschiedene Detailstufen. Hierbei geht es um die Polygonanzahl und nicht um die Textur (hierfür wären Mip Maps). In der Engine müssen die verschiedenen Stufen des LOD-Meshes dann zugewiesen und verknüpft werden. Anschliessend wird abhängig von der Distanz zum Objekt, dass passende Level of Detail (LOD-Mesh) ausgewählt um das Objekt zu rendern.

Lightmap

Eine Lightmap (Lightmapping) speichert die Helligkeitsinformationen von Oberflächen in einer eigenen Map/Datei. Meist werden Lightmaps nur für statische Objekte verwendet, weil die Lightmap nicht in realtime gerendert wird, sondern zuvor in die Texturen der Objekte bebaked wird. Das bedeutet, dass eine Lightmap erst dann erstellt werden sollte, wenn alle statischen Objekte ihre finale Position haben. Nötig ist die Anwendung einer Lightmap, weil nicht alle Assets in einer Szene mit dynamischen Schatten berechnet werden können.

Shadow Mapping

Shadow Mapping ist ein Algorithmus zur Berechnung von Schattenwürfen. Die Schatten werden anhand, einer aus der Lichtquelle generierten Depth Map (Deutsch: Tiefenkarte) oder auch Shadow Map, erstellt. Diese speichert die Abstände der Objekte zur Lichtquelle (Z-Buffer). Zusätzlich wird geprüft, welche Pixel von der Lichtquelle aus sichtbar sind und welche nicht. Somit funktioniert das Rendern mit Shadow Mapping in zwei Etappen. Zuerst wird aus der Sicht der Lichtquelle gerendert, um die Tiefeninformation zu generieren. Anschliessend wird die Szene normal von der gwünschten Sicht bzw. Camera aus gerendert und mithilfe der Shadow Map erkannt, welcher Pixel beleuchtet werden darf.

Pixel-Lit

Ein Pixel-Lit oder auch Pixel Shader/Fragmented Shader berechnet aus der Information des Vertex-Lit (Vertex Shaders), der hinzugefügten Texturen und anderer Benutzerdaten die Farbwerte/Transparenz der einzelnen Pixel. Dies bezieht sich allerdings nur auf das aktuelle Objekt und nicht auf den gesamten Screen. Ausserdem ist es nur mit Pixel-Lit möglich, Effekte wie Bumpmapping, Schatten usw. anzuwenden.

Vertex-Lit

Vertex-Lit ist der am einfachsten zu berechnende Shader. Jegliches Licht, das auf einen Vertex-Lit Shader trifft, wird in einem einzelnen Pass gerendert und ist deshalb schneller als jeglicher Pixel-Lit Shader. Sogar Lichter, welche als Pixel Light markiert sind, rendert dieser Shader als Vertex Lights. Der Vertex-Lit Shader berechnet die Beleuchtung nur auf Vertex Basis und interpoliert die gesamte Beleuchtung über die Pixel der Objekt Triangles. Dadurch können keine Pixel basierten Rendering Effekte angewendet werden ( Bumpmapping, Shadows...).

Unlit

Unlit Shader sind Shader, welche keinerlei Rücksicht auf Licht nehmen. Es werden weder Highlights, noch Schatten oder Ähnliches dargestellt. Dies kann beispielsweise für GUI Elemente nützlich sein, oder andere Objekte, welche ohne Berücksichtigung der Beleuchtung gerendert werden sollen.

Batching

Wenn mehrere Objekte, in echtzeit zusammen, in einem einzelnen Draw Call gerendert werden können, spricht man von Batching. Umso mehr Objekte die Software durch Batching verarbeiten kann, desto mehr Performance wird im CPU Bereich eingespart. Damit es der Software möglich ist Batching Verfahren anzuwenden, müssen die Objekte dieselben Materials besitzen. Das heisst man sollte versuchen für möglichst viele Objekte dieselben Materials zu benutzen.

Occlusion Culling

Occlusion Culling ist ein Verfahren, durch das sich das Rendern von verdeckten Objekten deaktivieren lässt. Dies geschieht nicht automatisiert, weil normalerweise zuerst die Objekte dargestellt werden, welche am weitesten weg von der Camera sind und anschliessend jene die näher bei der Camera liegen (dies wird overdraw genannt). Somit lässt sich durch Occlusion Culling verhindern, dass die Software unnötige Objekte rendert. Dies wiederum führt zu einer Performance Verbesserung. Zusätzlich kann noch Frustum Culling aktiviert werdern. Dies verhindert das Rendern von Objekten, welche nicht im Sichtbereich der Camera liegen.

Étudier