Ottimizzazioni
by Carlo
Macchiavello
Stavo
facendo un lavoro semplice, ma con tempi di calcolo decisamente
troppo alti, dopo qualche esperimento per ottimizzare i
tempi di calcolo, ho deciso di buttar giù due righe
sui tentativi e i risultati nell'ottimizzazione della scena.
Il progetto era un'animazione in cui sono coinvolte
delle semplici sfere (che rappresentano delle perle colorate)
che si muovono su di un piano, inizialmente pensavo a tempi
di calcolo irrisori.
Stavo lavorando con un'area light come luce
principale per avere una luce più morbida e ombre
sfumate, ma contrariamente alle mie previsioni, i tempi
di calcolo erano oltre i 20 minuti per una manciata di poligoni,
meno di 32.000...
Anche sostituendo l'Area light con una spotlight i
tempi non scendevano in modo produttivo, non andavo sotto
i 12 minuti, con una qualità decisamente inferiore
di ombre e di resa nello shading.
La creazione delle ombre morbide è uno dei
task che porta via più tempo nel rendering di Lightwave,
e quindi dovevo aggirare l'ostacolo, soprattutto visto che
qui non avevo necessità di ombre portate, ma semplicemente
ombreggiature per dare la distanza tra il piano e le perle.
Ho provato a spegnere le luci e abilitare il radiosity
in modalità Backdrop, questo ha tagliato i tempi
alla metà, il che era ironico visto che il radiosity
è un metodo dispendioso a livello di tempi di calcolo;
le nuove tecnologie implementate con la release 9.2 hanno
accelerato molto il rendering del radiosity, ma non era
sufficientemente ottimizzato e non mi dava una resa tanto
differente da giustificarlo come scelta di rendering.
Ho iniziato a sperimentare i nodi di Occlusion per
aggiungere l'ombreggiatura necessaria senza però
arrivare al radiosity, e dopo aver sperimentato con i due
nodi di serie con LightWave 9.2, e il nodo free Poms, ho
ritrovato un vecchio classico, già molto efficiente
come shader, il nodo SG_ambient occlusion, che mi offriva
una buona resa, con circa 4 minuti di rendering a fotogramma.
Per ottimizzare ulteriormente ho utilizzato la Real
lens camera e i nuovi algoritmi di antialiasing, in modo
che la granulosità dell'occlusione ambientale venisse
ridotta non con un maggior numero di campionamenti nell'occlusione,
ma con più passate di antialiasing, il che mi avrebbe
fatto guadagnare ulteriormente nei tempi di calcolo.
Per capire come funziona il nuovo antialiasing si
deve dare un minimo di spiegazione:
I parametri di controllo principali sono antialiasing (che
controlla numericamente il numero di passate) e Adaptive
sampling threshold (che indica la soglia entro la quale
il pixel viene ricampionato più volte).
In pratica per ogni passata di antialiasing adaptive
sampling analizza il pixel e determina quante volte deve
essere ri campionato per raggiungere l'antialiasing ottimale,
per ogni ricampionamento abbiamo una serie di passaggi che
crescono in modo incrementale al doppio, cioè se
un pixel si discosta poco dal valore di soglia, l'adaptive
sampling fa ricampionare 2 volte il pixel per ogni passata
di antialiasing, se è un po' di più lo fa
ricampionare di 4 volte, 8 volte, 16 volte e così
via, a seconda del valore impostato nel threshold (soglia
di antialiasing).
Il valore parte da 1, praticamente nullo come effetto.
0.1 comporta già un discreto lavoro di antialiasing,
0.05 che fornisce già una buona resa senza avere
tempi troppo lunghi.
0.01 è già un ottimo antialiasing ma talvolta
tende ad essere troppo lento.
Il trucco in questo caso è trovare la giusta
combinazione del numero di passate con la soglia ottimale,
perché alle volte è più efficiente
fare più passate con un threshold più alto,
che fare poche passate con un threshold più basso
che costringe infinite o quasi passate di antialias sulla
scena.
In questo caso per esempio, la scelta ottimale è
stata 2 passate di antialias con 0.05 di threshold, con
una soglia come questa l'occlusione sotto le perle è
sufficientemente ammorbidita per non mostrare granulosità,
ma rapida da svolgere per ogni passata di antialiasing,
e con 2 passate pulisce tutte le imperfezioni.
Non dimenticate che ogni passata si somma alla precedente,
per cui si ha il vantaggio che se riusciamo a “pulire”
l'ombra e le imperfezioni con la prima passata di antialiasing,
la seconda e la terza passano e lavorano meglio e più
rapidamente, perché devono concentrarsi solo sui
dettagli e non sulle macro aree dei difetti su aliasing
e ombre in generale.
Nota bene: il controllo adaptive sampling threshold
lavora in modo completamente diverso nelle nuove camere
rispetto alla classic camera.
Nella classic determina SE un pixel ha uno
scostamento di contrasto sufficientemente alto da essere
incluso o no nella passata di antialiasing, ma il numero
di passate finali è quello relativo al tipo di antialiasing
(low, medium, high, estreme), non oltre.
Il nuovo Adaptive sampling che agisce nelle nuove
camere definisce il numero di passate per far si che il
pixel raggiunga quella soglia di contrasto, praticamente
l'opposto del vecchio.
Il classic indica il contrasto per applicare o no
l'antialiasing, il nuovo invece indica il contrasto da raggiungere,
con un numero x di passate aggiuntive finché non
si raggiunge quel valore di Antialiasing.
Esperimenti suggeriti:
-
Sg_ambient occlusion ha anche una modalità
directional dal quale calcola i raggi, provate ad usare
le coordinate dell'area light, però ribassando
il valore della Y, potreste avere delle interessanti
sorprese per simulare ombre sfumate con SG_Ambient Occlusion
-
Provate a usare alternativamente lo shader e
il nodo, notando come siano possibili diverse applicazioni
di entrambi, sfruttando uno o l'altro a seconda dei
casi.
-
Provate ad aggiungere un 10% di luminosità
e abbassare di un 5% la diffusione del materiale, questo
vi aiuterà ad avere meno contrasto sul materiale
e quindi avere immagini più pulite e meno tempo
di antialiasing, perché la luminosità
aggiunta darà un minor contrasto ai pixel.
Sperando che queste riflessioni vi possano essere utili
per migliorare i vostri tempi di calcolo, vi auguro buon
lavoro.
|