Olà!
Questo tutorial cerca di spiegare cosa è Renderman e spiega come è organizzato un file RIB.
In primo luogo definiamo cos’è Renderman: Renderman è un’interfaccia, esattamente come lo è OGL.
Esistono vari motori di rendering “Renderman compliant”, e ne trovate un po’ qui:
http://www.renderman.org/RMR/OtherLinks/ index.html
Aggiungo “Pixie”, un motore sotto licenza GPL.
Prima di tutto, dove viene utilizzato Renderman? Fondamentalmente nelle produzioni cinematografiche. Essendo stato inventato da Pixar, viene utilizzato in tutti i suoi film, ma anche in moltissimi altri. Trovate maggiori info qui:
https://renderman.pixar.com/products/wha tsrenderman/movies.html
Un motore “Renderman compliant” è un motore che supporta tutte le funzionalità spiegate in questo documento:
https://renderman.pixar.com/products/ris pec/rispec_pdf/RISpec3_2.pdf
Che, se vi interesserà la questione, diverrà il documento che maggiormente consulterete mentre lavorate con Renderman.
Per comodità in questa trattazione parlerò sempre di Renderman come se fosse un motore di Rendering, in modo da essere indipendente da quello che sceglierete di usare.
Io uso “Blue Moon Rendering Tool”, che potete trovare qui:
http://klee.usr.dico.unimi.it/~dan/grafi ca/doc/bmrt/bmrt-2.6.zip
Ed è uno dei pochi posti dove ancora lo potete trovare, poichè la ditta che lo faceva ha chiuso.
Renderman riceve in input un file RIB, che altro non è che un file di testo, contenente tutta la descrizione della scena.
In una scena possono esserci, come ci immaginiamo, luci ed oggetti.
Gli oggetti possono essere fatti di vari materiali, che interagiranno in maniera diversa con la luce a seconda di come sono fatti. Questi materiali si chiamano “Shaders”.
Vediamo un esempio semplicissimo di file RIB:
----INIZIO----
Display "simple.tif" "framebuffer" "rgb"
Format 320 240 1
Projection "perspective" "fov" 45
PixelSamples 2 2
WorldBegin
Color [1 0 0]
Translate 0 0 5
Sphere 1 -1 1 360
WorldEnd
----Fine----
Vediamolo meglio:
“Display” specifica in che modo la nostra scena verrà salvata e visualizzata.
“simple.tif” è il file nel quale sarà salvata
“framebuffer” significa che mentre la scena viene creata, verrà mostrata sullo schermo
potrebbe essere “tiff”, e non verrebbe mostrata, ma solo salvata.
“rgb” è il formato dei colori che verranno salvati. Potrebbe essere ad esempio “rgba”
“Format” dice quanto grande deve essere la scena in pixel
“Projection” definisce il tipo di proiezione. In questo caso, e nel 99% dei casi, la proiezione è in prospettiva.
“PixelSamples” è il nostro amato Antialiasing. Oltre 4x4 inizia a diventare decisamente troppo pesante.
Tra “WorldBegin” e “WorldEnd” ci sono tutte le definizioni del mondo.
Nel nostro mondo c’è solo una sfera
La sfera si definisce in questo modo:
Renderman è una macchina a stati, quindi se settiamo uno stato, esso è valido fino a che non cambia.
In questo caso ho settato il colore ed una traslazione (abbastanza chiara da sé), e saranno valide anche sugli oggetti successivi.
Sulle traslazione c’è altro da dire, ma ne parleremo dopo.
Se lanciamo il rendering di questa cosa (in blue moon è così “rendrib file.rib”) otterremo questo :
Non molto, vi pare? Questo perché non ho definito alcuna luce, non ho definito nessuno shader e non ho settato nulla.
Avrete notato la sfera: in genere si usano le primitive (tipo il piano, la sfera, il toroide e così via) solamente per fare i test degli shaders, questo perché, come immaginerete, si modella il tutto con u software qualsiasi e poi si esporta in RIB, dove poi si lavora con gli shaders.
In Renderman la parte fondamentale quindi non è la modellazione, ma la resa visiva dei nostri modelli.
Ed anche perché sarebbe stupido fare i test degli shaders con il modello di Mike Wazowski
TRASLAZIONI: PROBLEMA.
Prima parlavo di traslazioni. Bene, le traslazioni sono applicate in una maniera un po’ strana.
Prendiamo un esempio:
WorldBegin
Color [1 0 0]
Translate 0 0 5
Scale 4 4 1
Sphere 1 -1 1 360
WorldEnd
Prima viene cercata la mesh (in questo caso la sfera), poi si cercano tutte le trasfomazioni da applicargli che si trovano sopra. Quindi verrà prima applicata la “Scale” e poi la “Translate”.
Se mettiamo sotto un’altra cosa (esempio):
WorldBegin
Color [1 0 0]
Translate 0 0 5
Scale 4 4 1
Sphere 1 -1 1 360
Translate 1 0 5
Scale 4 6 1
Sphere 1 -1 1 360
WorldEnd
La seconda sfera avrà anche tutte le trasformazioni della precente:
Questo potremmo non volerlo (o esgierlo, se stiamo facendo animazioni con bones), quindi dovremo isolare il tutto così:
WorldBegin
AttributeBegin
Color [1 0 0]
Translate 0 0 5
Scale 4 4 1
Sphere 1 -1 1 360
AttributeEnd
AttributeBegin
Translate 1 0 5
Scale 4 6 1
Sphere 1 -1 1 360
AttributeEnd
WorldEnd
Così:
Direi che per questa volta può bastare
Nella prossima vedremo qualche shader, che altro non sono che dei programmi scritti in simil-C.