Open Source im professionellen Einsatz

3D-Standard Renderman

Rendern wie die Profis

Wer mit Pixars Renderman aus 3D-Szenen hochklassige Bilder rechnen will, muss ganz schön tief in die Tasche greifen. Dabei genügen schon freie Implementierungen, um mit dem offenen Standard in die 3D-Welt einzusteigen. Auch sie liefern immer bessere Resultate.

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.

Listing 1:
»kugel_einfach.rib«

01 Display "kugel.tif" "file" "rgb"
02 WorldBegin
03    Sphere 1 -1 1 360
04 WorldEnd

Listing 2:
»kugel.rib«

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

Listing 3:
»planet.rib«

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

Diesen Artikel als PDF kaufen

Als digitales Abo

Als PDF im Abo bestellen

comments powered by Disqus

Ausgabe 07/2013

Preis € 6,40

Insecurity Bulletin

Insecurity Bulletin

Im Insecurity Bulletin widmet sich Mark Vogelsberger aktuellen Sicherheitslücken sowie Hintergründen und Security-Grundlagen. mehr...

Linux-Magazin auf Facebook