Das große Thema des letzten Workshop Tages war die Dokumentation der vorher praktizierten Übungen. Dafür schlug ich vor, jeden für jeden Tag einen representativen Mini-Planeten zu schaffen, welcher das Thema des Tages aufgreift und zeigt, was wir alles gelernt haben.
Durch den Import diverser Packages aus dem Asset Store (free!) konnten wir uns gezielt um die Gestaltung dieser Planeten kümmern. Dafür importierten wir uns Polybrush als kreatives Tool innerhalb von Unity zum Sculpten, TextureBlending und Scattern von Umgebungsassets. Gemeinsam schufen wir so einen ersten kleinen Wald-Planeten.
Den Studierenden war es zu dieser Zeit freigestellt, wie sie ihre Dokumentation vollführen. Dies war meine persöhnliche Wunschvorstellung einer Dokumentation, mit der man ein durchaus ansehnliches Endergebnis zeigen kann.
Am vierten Workshop Tag befassten wir uns hauptsächlich mit Wünschen der Studierenden oder allgemein nützlichen Tipps und Tricks entlang Shader. Dabei entstanden eher kleine und weniger komplexe Graphen.
So zum Beispiel der SceneDepth Graph, mit welchem wir einen Tiefenpass, von der Kamera ausgehend, über Unity rendern können. Viele Animationen, Trailer, Cutscenes oder ähnliches bedürfen einen solcehn Tiefenpass um später im Compositing Porgramm Tiefenschärfe akkurat einstellen zu können.
Ebenso wurden wabernde Skybox Shader thematisiert. Über das Ineinanderblenden verschiedener Noises können wir wolkenähnliche Strukturen schaffen, die über eine Geometrie laufen – je nachdem, welche Geschwindigkeit (Speed) wir einstellen.
Im Verlauf ging es ebenso darum, wie man volumetrisches Licht sehr performant faken kann. Dafür brauchen wir lediglich einen Zylinder ohne Boden Faces. Die Transparenz steuern wir über einen Verlauf entlang der Y-Koordinaten und die Sichtachse.
Zum Abschluss des Tages wurde es nochmal ein wenig theoretischer. Wir wollten einen Celshade / Toonshader schaffen. Charakteristisch dafür ist ein Ramp-Falloff über eine bestimmte Anzahl von Farben, anstelle eines weichen Schatten Farbverlaufs. Da es im Shadergraph keine Möglichkeit gibt, auf das Licht in der Szene zuzugreifen, mussten wir uns also eine Custom Function bauen. Darin können wir per Shadercode auf das „Hauptlicht“ in der Szene – in diesem Beispiel ein Directional Light – zugreifen. Wichtig hierbei ist anzumerken, dass diese Funktion aktuell NICHT in der High Definition Render Pipeline funktioniert und wir deshalb an diesem Tag in der Lightweight Render Pipeline arbeiteten.
Am dritten Tag des Workshops drehte sich alles um das Thema „Vertex Displacement“.
Auch hier begannen wir damit, über eine Textur und eine Mask die Geometrie eines Objekts zu manipulieren. In diesem Falle war diese Geometrie eine simple, mit mehr Vertices versehene, Plane, die wir über eine Sinuskurve entlang der Amplitude (wenn man so möchte – das „Offset“) beeinflussen.
Später ging es dann in die Grundlagen von Wasser-ähnlichen Zügen bis hin zu sehr scharfkantigen, Igel-artigen Versuchsanordnungen. Desweiteren wurde gezeigt, wie wir auf Shaderproperties mithilfe von Script und / oder Playmaker zugreifen können. In diesem Videoclip wird nach gewisser Zeit die F1 Taste gedrückt, wodurch wir in Playmaker States hin und her wechseln.
Im letzten Beispiel des Tages ging es dann darum, Effekte wie das wehen im Wind zu simulieren. Dafür wurde sich eine kleine Wiese angelegt, die wir zum Schwingen brachen. Die UV-Maske am Ende des Shadergraphs stellt dabei ein, dass das Gras nicht als gesamtes Objekt mitschwingt, sondern nur der „obere Teil“, wie es bei Gras oder Pflanzen auch üblich ist.
Am zweiten Tag des Workshops drehte sich alles um das Thema „Reveal“.
Auch hier wurde begannen wir mit dem Blenden über einer Texture – dieses mal jedoch über das AlphaClipping. Dadurch können wir steuern, welche Flächen gerendert werden und welche nicht. Die Farbe weiß bedeutet dabei den numerischen Wert „1“ und wird als sichtbar – also gerendert – dargestellt, während schwarz unsichtbar erscheint.
Im Verlauf des Tages experimentierten wir mit verschiedenen Wegen das Objekt einzublenden – einmal über eine Textur, später über eine Noise und am Ende gerichtet über eine WorldPosition-Mask. Desweiteren bauten wir eine Bool-Logik in den Shader ein, um zwischen Textur (Bild) und Noise (Procedural) hin und her zu wechseln, um so die Unterschiede zu erkennen.
Als Ergebnis des Tages hatten wir zwei Fahrzeuge, welche auf verschiedenste Art und Weisen stilisiert gerendert wurden – einmal als Reveal, ein anderes Mal mit Hologramm Charakter.
Hier hat sich wer die Mühe gemacht jede Node kurz zu erklären, wenn auch manchmal etwas lückenhaft. Dennoch ein durchaus sinnvoller Einstieg oder Research!
Wir begannen mit einem theoretischen Ansatz, um uns an das Thema heranzuwagen. Dabei ist in zuerst individuellem Research und später einem Zusammenführen der neuen Erkenntnisse ein theoretisches Dokument entstanden.
Im Anschluss ging es dann um einen Einstieg in Shadergraph – ein visuelles, node-basiertes Tool, um Shadercode zu generieren. Dabei war zunächst die Addressierung von Texturen und Properties das Ziel.
Im späteren Verlauf sollten wir diese neu gewonnenen Kenntnisse damit umsetzen, um mehrere Texturen ineinander zu blenden. Mit diesem Ansatz kann man beispielsweise Schnee auf ein Objekt projizieren als obere Textur. Dies geschah über die Positionierung der UVs des Objekts, über die VertexColor (welche wir mit Polybrush definierten), und über eine WorldPosition.
In den unteren Screenshots findet ihr den Aufbau der jeweiligen Shadergraphs. Die Beschriftung der einzelnen Bausteine versucht den Teilschrift zu beschreiben und kann gegebenenfalls nicht 100% akkurat sein.