Wer wurde 41-mal für einen Oscar nominiert? Nein, nicht Steven Spielberg, sondern die Renderman-Software des Animationsstudios Pixar. Genau genommen nicht die Software selbst, sondern die Filme, die mit ihr gerendert wurden, von "Toy Story" über "Finding Nemo" bis zu "Spiderman". Angesichts solcher Leistung verlieh die Academy auch tatsächlich den Kernprogrammierern des Renderers eine Auszeichnung [1].
Genau genommen bezeichnet Renderman allerdings gar kein Softwareprodukt, sondern nur die von Pixar erdachte Spezifikation für die Beschreibung von Szenen und Oberflächen [2]. Dementsprechend gibt es von ihr mehrere Implementierungen. Dieser Artikel beschreibt die verbreiteten Renderman-Renderer für Linux und verrät, wie man sie für eigene 3D-Szenen nutzt.
Wettrennen mit Patenten
Die Renderman-Spezifikation ist recht umfangreich und deckt von der Modellierung übers Licht bis zum Motion Blur viele Bereiche ab. Prinzipiell muss jeder kompatible Renderer alle vorgeschriebenen Features implementieren, selbst wenn er beim Aufruf einer Funktion nur eine Fehlermeldung zurückliefert. Vor allem auf fortgeschrittene Techniken müssen die Benutzer freier Renderer oft verzichten. Selbst Pixars Photorealistic Renderman (PRMan) beherrscht erst seit kurzem Raytracing. Solche Leistung hat ihren Preis: 3500 Dollar kostet das Einstiegspaket.
Mit solchen Features setzt er sich bei der Rendering-Qualität an die Spitze des Feldes, dem noch einige kommerzielle Konkurrenten folgen. Eine Zeit lang war das aus der freien Implementierung Blue Moon Rendering Tools (BMRT) hervorgegangene Programm Entropy der Firma Exluna ein ernst zu nehmender Konkurrent zum halben Preis - bis Pixar zu seinem Patent-Portfolio griff [3]. Nach weiteren Klagen ging Exluna schließlich in Nvidia auf und die 3D-Welt war um einen freien und einen kommerziellen Renderer ärmer, mit etwas Glück findet man aber noch ältere BMRT-Versionen im Netz. Auch bei 3Delight [4] handelt es sich um ein kommerzielles Produkt, von dem es eine uneingeschränkte Einzelplatzversion gibt.
Bislang blieben die anderen freien Renderman-Implementierungen Aqsis [5] und Pixie [6] von Patentprozessen verschont. Letzterer ist weniger bekannt als Aqsis, obwohl es sich eigentlich um den besseren Renderer handelt, der zum Beispiel auch Raytracing beherrscht. Unter den Außenseitern finden sich einige Programme, die zwar mehr oder weniger große Teile der Renderman-Spezifikation übernehmen, aber keine besonders guten Ergebnisse liefern. Als Lehrbeispiel für die Implementierung sind sie aber geeignet, zum Beispiel der in Java geschriebene Jrman [7].
Einfaches Textformat
Obwohl das Renderman-Format RIB (siehe Kasten "Renderman-Interface in C") eher dazu dient, Szenendaten zwischen Modeler und Renderer auszutauschen, kann man einfache Szenen auch mit einem Texteditor schreiben. Listing 1 zeigt eine rudimentäre Renderman-Datei, die nur eine Kugel repräsentiert. Der Renderer Pixie stellt zum Rendern das Programm »rndr« zur Verfügung, das als Argument die RIB-Datei akzeptiert. Die Namen der ausführbaren Programme aller Pakete zeigt Tabelle 1.
Das Ergebnis, das der Renderer in der Bilddatei »kugel.tif« speichert, ist allerdings nicht sehr ansprechend: Die Kugel erscheint lediglich als rein weiße Kreisfläche. Der Grund dafür ist, dass es keine Transformationen der Geometrie gibt, die Kugel also im Koordinatenursprung liegt. Die Default-Kamera zeigt genau dorthin, außerdem fehlt auch jegliche Beleuchtung in der Szene. Die Anweisung »Display« in Zeile 1 bringt den Renderer dazu, eine Bilddatei »kugel.tif« im RGB-Format zu schreiben.
Einige zusätzliche Zeilen machen die Szene aber gleich ansprechender. So stellen die Zeilen 4 und 5 in Listing 2, vor »WorldBegin« eingefügt, die Kamera auf eine Perspektive ein und verschieben sie um sechs Einheiten in positiver Z-Richtung. Die erste Zeile sorgt nun dafür, dass der Renderer keine Bilddatei schreibt, sondern das Ergebnis in einem Fenster anzeigt. Zeile 2 legt dafür die Größe fest, die 1 steht für das Seitenverhältnis der Pixelgröße. Solch detaillierte Kontrolle erlaubt Renderman über die Bildberechnung.
Die Anweisung in Zeile 10 spezifiziert mit dem bekannten RGB-Tripel die Farbe der Kugel, die folgende Zeile die Oberflächenqualität hinsichtlich ihrer Reflexionseigenschaften. Damit man überhaupt etwas sieht, schaltet »LightSource« in Zeile 7 ein gleichmäßiges Umgebungslicht »ambientlight« ein. Das Ergebnis in Abbildung 1 sieht entsprechend flach aus, denn alle Teile der Kugel werden gleich beleuchtet.
Renderman arbeitet als State Machine, befindet sich also stets in einem definierten Zustand, der nachfolgende Operationen bestimmt. Legt Zeile 10 in Listing 2 die Farbe fest, zeichnet der Renderer alle Körper ab dieser Stelle in jener Farbe. Genauso verhält es sich mit Koordinatenransformationen.
01 Display "kugel.tif" "file" "rgb"
02 WorldBegin
03 Sphere 1 -1 1 360
04 WorldEnd
|
01 Display "display" "framebuffer" "rgba"
02 Format 320 200 1
03
04 Projection "perspective" "fov" [30]
05 Translate 0 0 6
06
07 LightSource "ambientlight" 1 "intensity" [0.5]
08
09 WorldBegin
10 Color [1.0 0.3 0.1]
11 Surface "plastic"
12 Sphere 1 -1 1 360
13 WorldEnd
|
01 Display "display" "framebuffer" "rgba"
02 Format 1024 768 1
03
04 Projection "perspective" "fov" [30]
05 Translate 0 0 6
06
07 WorldBegin
08 LightSource "ambientlight" 1 "intensity" [0.2]
09
10 TransformBegin
11 Attribute "identifier" "string name" ["spot"]
12 Translate -2.0 2.0 -2.0
13 LightSource "spotlight" 0 "intensity" 75.0000 "lightcolor" [1.0 1.0 1.0] "coneangle" 2.5
14 TransformEnd
15
16 # Hintergrund
17 Color [0.3 0.3 0.3]
18 Surface "paintedplastic" "Ks" 0.2 "texturename" "yale3.tif"
19 Polygon "P" [-5.0 -5.0 5.0 -5.0 5.0 5.0 5.0 5.0 5.0 5.0 -5.0 5.0]
20
21 # Erde
22 TransformBegin
23 Rotate -90 -1 1 0
24 Color [1.0 1.0 1.0]
25 Displacement "earth_bumps" "bumps_file" ["earthbump1k.tif"] "Km" 0.05
26
27 Surface "paintedplastic" "Ks" 0.2 "texturename" "earthmap1k.tif" "roughness" 0.5
28 Sphere 1 -1 1 360
29 TransformEnd
30
31 # Mond
32 TransformBegin
33 Translate 1.5 -0.5 1
34 Scale 0.3 0.3 0.3
35 Color [1.0 1.0 1.0]
36 Surface "paintedplastic" "Ks" 0.1 "texturename" "moon.tif"
37 Sphere 1 -1 1 360
38 TransformEnd
39 WorldEnd
|