Aus Linux-Magazin 11/2005

3D-Standard Renderman

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

Licht und Schatten

Ähnlich wie bei der Fotografie ist auch bei realistischer 3D-Grafik die richtige Beleuchtung das A und O. Entsprechend viele Möglichkeiten bietet Renderman dafür, die eigene Szene auszuleuchten. Das unendlich entfernte Licht »distantlight« schickt die Strahlen parallel auf die Szene, sodass sich Helligkeitsunterschiede nur durch den unterschiedlichen Abstand zwischen den Punkten auf der Oberfläche eines Objekts und der Lichtquelle ergeben.

Anders beim Punktlicht »pointlight« und beim Spotlicht »spotlight«. Bei beiden richtet sich die Helligkeit der Oberfläche nach dem Einfallswinkel der Lichtstrahlen, die kegelförmig von der Quelle ausgehen. Sie unterscheiden sich im Grad des Abfalls der Helligkeit vom Zentrum des Lichtkegels nach außen.

Abbildung 1: Bloßes Umgebungslicht lässt die Szene flach erscheinen, hier eine rote Kugel.

Abbildung 1: Bloßes Umgebungslicht lässt die Szene flach erscheinen, hier eine rote Kugel.

Neben dem Licht bestimmt die Oberfläche das Aussehen der Objekte. Bahnbrechend war Renderman seinerzeit mit dem Konzept kompilierter Shader, die das Licht reflektierende Verhalten der Oberflächen festlegen. Shader sind kleine Programme, die der Renderer bei der Berechnung immer wieder aufruft. Die Idee hat sich durchgesetzt und findet sich auch beim inkompatiblen Renderman-Konkurrenten Mental Ray, in jüngster Zeit sogar bei Echtzeit-3D (siehe den Artikel in diesem Schwerpunkt).

Im einfachsten Fall setzen Shader nur die Farbe auf einen von der Lichteinstrahlung und der Grundfarbe abhängigen Wert. Allerdings kann ein Shader auch das Aussehen nach dem Ort auf dem Objekt festlegen. Sogar Verschiebungen der Geometrie selbst sind mit so genannten Displacement Shadern möglich. Abbildung 2 zeigt eine etwas komplexere Szene mit mehreren Lichtquellen, Bildern als Texturen und einem Displacement Shader. Listing 3 gibt die zugehörige RIB-Datei wieder, Listing 4 den Shader.

Abbildung 2: Displacement Mapping mit Renderman verschiebt im Gegensatz zu Bump Mapping wirklich die Oberflächenpunkte - zu sehen am Umriss der Erde.

Abbildung 2: Displacement Mapping mit Renderman verschiebt im Gegensatz zu Bump Mapping wirklich die Oberflächenpunkte – zu sehen am Umriss der Erde.

Neben dem Einsatz der beschriebenen Lichtarten demonstriert die Szene den Umgang mit Koordinatentransformationen. Zeichnet eine Anweisung ein Objekt, tut sie das im gerade aktuellen Koordinatensystem. »TransformBegin« in Listing 3 (Zeile 22) dient dazu, eine lokale Transformation zu starten. »TransformEnd« stellt den alten Zustand wieder her. Später erzeugte Objekte bleiben von der Transformation unberührt. Zeile 27 weist dem Textur-Shader die Bilddatei »earthmap1k.tif« zu, Zeile 25 aktiviert den Displacement Shader mit einem Graustufenbild.

Modeler für Renderman

Auf Dauer RIB-Dateien von Hand schreiben ist doch recht mühsam. Deshalb bieten sich Modellierprogramme an, die selbst das Format beherrschen. K3-D [8] und Ayam [9] können das von Haus aus, für die anderen gängigen Modeler gibt es meist Export-Plugins, allerdings sind die von unterschiedlicher Qualität. Die meisten angefangenen Plugin-Projekte für Blender [10] scheinen eingeschlafen zu sein, neuere sind noch experimentell. Die Probleme, ein Renderman-Plugin zu schreiben, hängen mit der internen Struktur von Blender zusammen.

Tabelle 1:
Programmnamen

 

Paket

Renderer

Shader-Compiler

PRMan

render

shader

Aqsis

aqsis

aqsl

Pixie

rndr

sdrc

BMRT

rendrib

slc

Für den etwas ungewöhnlichen Modeler Wings3D ist ein recht brauchbares Plugin unter [11] zu finden, das allerdings kaum Materialien und Shader beherrscht. Beim nachträglichen Hinzufügen von Hand kommen aber wenigstens die hier vermittelten Renderman-Kenntnisse zu Ehren. Außerdem passt das Plugin immer nur zu einer bestimmten Wings-Version. Wer das neueste verwenden will, muss auf ein recht altes Wings zurückgreifen, denn das Plugin wurde schon länger nicht mehr aktualisiert.

Kein Monopol, aber wichtig

Renderman hat sich in den letzten 20 Jahren als anerkannter Standard in der wildwüchsigen 3D-Szene behauptet. Wer eine Modellierungssoftware benutzt, die das Renderman-Format beherrscht, kann auf eine ganze Reihe von Renderern zurückgreifen. Der teure PRMan von Pixar liefert klarerweise die besten Ergebnisse, doch auch der freie Pixie befriedigt hohe Ansprüche.

Renderman-Interface in
C

Neben dem im Artikel erklärten Renderman-Format für Dateien (Renderman Interface Bytestream, RIB) gibt es auch ein C-API. Die Namen der Funktionen stimmen im Wesentlichen mit den Schlüsselwörtern der RIB-Dateien überein, besitzen jedoch das Präfix »Ri«. Auf diese Weise wird aus »WorldBegin« zum Beispiel »RiWorldBegin()«. Entsprechend repräsentieren C-Makros die Schlüssel-Strings der RIB-Dateien: »RI_FILE« statt »”file”«. Das C-API bietet sich vor allem für selbst geschriebene Software an, die dynamisch Renderman-Szenen entwirft. Die nötige Headerdatei heißt »ri.h«, die Library meist Libri, das Linker-Flag also »-lri«.

Wer freie Software schreibt, egal ob Renderer oder Modeler, sollte Renderman als Interface in Betracht ziehen, denn damit findet das eigene Programm leicht Anschluss. Auch mit Skriptsprachen lassen sich Tools für Renderman schreiben, etwa einfache Modeler oder grafische Editoren für Shader.

Diese Beschäftigung hat auch einen Zusatznutzen: Wer mit selbst geschriebenen Tools seine Renderman-Kenntnisse beweisen kann, hat bei den meisten Animationsstudios schon einen Bonus. Weil die anderen verbreiteten Renderer wie Mental Ray ähnliche Konzepte verwenden, ist das mit Renderman erworbene Wissen um 3D-Grafik in keinem Fall verloren. Tipps für fortgeschrittene Renderman-Techniken geben [12] und [13], RIB-Dateien und Shader finden sich in großer Zahl auf [14].

Listing 4:
»earth_bumps.sl«

01 displacement earth_bumps (float Km = 0.03; string bumps_file = "")
02 {
03    float size;
04    size = float texture(bumps_file);
05    P += Km * size * normalize(N);
06    N = calculatenormal(P);
07 }

Infos

[1] Oscar für Renderman: [http://renderman.pixar.com/products/whatsrenderman/awards.html]

[2] Renderman-Spezifikation: [http://renderman.pixar.com/products/rispec]

[3] Patentstreit: [http://www.renderman.org/RMR/OtherLinks/blackSIGGRAPH.html]

[4] 3Delight: [http://www.3delight.com]

[5] Aqsis: [http://www.aqsis.com]

[6] Pixie: [http://pixie.sf.net]

[7] Jrman: [http://www.jrman.org]

[8] K3-D: [http://k3d.sourceforge.net]

[9] Ayam: [http://ayam.sourceforge.net]

[10] Blender: [http://www.blender.org]

[11] Wings3D-RIB-Exporter: [http://www.midcoast.com.au/~rgcoy]

[12] Renderman-Tutorials: [http://www.rudycortes.rendermanacademy.com/tutorials/rmantuts]

[13] Pixie-Wiki: [http://www.george-graphics.co.uk/pixiewiki]

[14] Renderman-Repository: [http://www.renderman.org]

LINUX-MAGAZIN KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Readly Logo
E-Mail Benachrichtigung
Benachrichtige mich zu:
0 Kommentare
Älteste
Neuste Beste Bewertung
Nach oben