Let’s build a Raytracer, from scratch.

Kurzbeschreibung:

“Raytracing” — gar nicht so schwer, wie es klingt. Wir machen’s in < 500 Zeilen. From Scratch.
Kein OpenGL, kein Qt, kein Lizenzgenödel. Null Third-Party-Software. Plattformunabhängig.
Und du brauchst keine Vorkenntnisse, was Rendern oder Grafik angeht. Versprochen.
Das ist unser Endresultat:

Raytracer (example rendering)

 

Ziel des Kurses:
Die Teilnehmer haben ein grundlegendes Verständnis davon, wie Raytracing im Kern funktioniert, sowie einfach erweiterbaren Code mit Basisfunktionalität. Während des Kurses werden viele mögliche Erweiterungen angesprochen.

Benötigte Vorkenntnisse:
– Ein ganz klein bisschen C++
– Schon mal einen Vektor gesehen haben wäre ganz nett

Sprache:
Geplant Deutsch, bei Bedarf Englisch.

Verantwortliche Person:
Nikolaus Mayer

Beschreibungstext:

“Raytracing”, das ist diese… diese ominöse schwarze Magie… diese Hollywood-Hexerei, mit der man Science-Fiction-Filme machen kann… diese arkane Kunst, die “Renderer” benutzen, um uns arme Sterbliche mit ihrem Zauber zu betören, mit Worten wie “Maya”, “Blender”, “3ds Max”…
Um Raytracing zu können, muss man der absolut krasseste Turbonerd sein, und eine Serverfarm haben, und dem GPU-Satan seine Seele opfern, und…

ach ne, halt, das stimmt alles gar nicht.

Tatsächlich ist Raytracing nämlich total einfach.

Und weil es so einfach ist, entwickeln wir unseren eigenen Raytracer. Aus Zeitmangel (und um die Komplexität gering zu halten) können wir nicht alle Features einbauen, die eine “echte” Raytracing-Engine bieten würde: Kein Glas, kein Wasser, kein Rauch, keine Kaustiken, kein Fresneleffekt, kein Bumpmapping, kein Subsurface-Scattering, kein volumetrisches Licht usw…
Dafür hat unser Code weniger als 500 Zeilen, und wir benutzen nichts außer reinem, selbstgeschriebenem C++. Wer will, kann natürlich auch alles in Python schreiben. Oder Go. Oder Bash. Oder wasauchimmer. Oder Haskell.
Und der Code ist einfach erweiterbar, mit Ideen, die während des Kurses kurz vorgestellt werden, aber aus den oben genannten Gründen nicht sofort umgesetzt werden können.

Wir gehen Schritt für Schritt vor:

  • Wir erzeugen ein leeres Bild
  • Wir rendern einen Boden und einen Himmel, und positionieren eine virtuelle Kamera
  • Wir rendern ein Polygon
  • Wir rendern Kugeln
  • Wir erzeugen eine Lichtquelle und berechnen Schattenwurf und Highlights.
  • Wir implementieren Antialiasing, weiche Schatten, matte Oberflächen
  • Wir erzeugen Tiefenschärfe-Effekte (jaja, “Schärfentiefe” ist auch ok)
  • Wir rendern ein texturiertes Objekt

Unser Code ist dabei nicht auf Effizienz oder Geschwindigkeit ausgelegt, sondern auf einfache Lesbarkeit und Modularität. Daher verzichten wir auch auf Multithreading und GPU-Unterstützung, obwohl diese Anwendung absolut “embarrassingly parallel” ist.

Voraussetzungen:

Teilnehmer benötigen einen Computer mit grafischer Oberfläche, C++-Compiler, sowie Internetverbindung (letztere nicht absolut notwendig). Ein schwachbrüstiges Notebook ist völlig ausreichend. Linux ist kein Muss.

Eine Grafikkarte ist nicht notwendig.