venerdì 19 ottobre 2007

Si ricomincia!

Finalmente ricomincio il lavoro :)
Dico subito che non ho scritto ancora codice, ma mi sono messo a progettare un po' di cose, e poiché sono sempre per uno sviluppo aperto vi illustro subito le novità.

La roadmap stà cambiando notevolmente, non è ancora pronta la nuova quindi non la pubblico, ma sappiate che la vecchia roadmap sta subbendo molti cambiamenti.
Per ora mi limito a dire cosa cambia nella 0.1.

Innanzitutto fermo alcune cose (ovviamente solo momentaneamente) che erano previste per la 0.1, in particolare il rendering distribuito, che verrà presumibilmente reinserito prima dell'uscita della 1.0, ma non ora.
Questo nonostante sia una delle cose più avanti col progetto, ed il motivo è che la complessità aggiunta è molto grande, ed aggiungerla ora è davvero molto pesante.
Il codice comunque rimane, in attesa di essere ripreso in seguito.

Un'altra cosa che cambia è il supporto dei job, che si modifica un po'.
Per spiegare come funzionano i job è necessario spiegare come funziona il processo di rendering e come viene suddiviso.

Innanzitutto abbiamo le scene. Ogni scena è un qualcosa che vogliamo renderizzare. Potrebbe essere un'immagine, un filmato e quant'altro.
Poiché per ora è prematuro cominciare a lavorare su cose come i filmati mi sono limitato al rendering di immagini, e di queste parlerò, più avanti potrò facilmente estendere il tutto in modo che funzioni anche coi filmati :)
Inizialmente cassata renderizzerà solo una scena alla volta, cosa che ovviamente cambierà.

Ogni scena è composta da una serie di layer. I layer sono rendering da fare singolarmente (in realtà la faccenda non sarà sempre così semplice, ho già in mente qualche chicca molto succulenta, ma prima di parlarne voglio avere le idee più chiare).
I layer servono per fare compositing, regolare l'intensità luminosa quando il rendering è finito e quant'altro.
Inizialmente cassata renderizzerà solo un layer per scena.
Ogni layer può avere un tipo diverso usato internamente (leggi il mio vecchio post per capire di che parlo).

Ogni layer è composto da pass. I pass inizialmente saranno virtualmente identici tra di loro, ma in futuro potrebbero essere realizzati con tecniche diverse (magari anche scelte dinamicamente per aumentare la velocità del rendering il più possibile).
Ogni pass sarà un rendering corretto, ed unendo più pass si diminuirà progressivamente il rumore. L'importanza dei pass deriva principalmente da 2 motivi:
  • L'utente decide di fare un pass ad una data qualità, viene un rendering e decide che quel rendering va bene, gli piace, ma è troppo rumoroso. Esegue quindi altri pass (magari uno solo ad alta qualità) per ridurre il rumore. Così facendo è possibile sia migliorare la qualità di un rendering, sia riprendere un rendering cominciato precedentemente (ovviamente solo tra un pass e l'altro), sia magari generare un'anteprima in pochi minuti e poi decidere che va bene e migliorarne la qualità.
  • Si potrebbero fare tanti pass con il rendering distribuito, e poi unirli tutti assieme in un secondo momento. Questo semplifica molto l'architettura distribuita ed ha buone prestazioni, ma tuttavia non è detto che siano le migliori possibili e poi bisognerà analizzare meglio la situazione.

Infine ogni pass viene ritagliato in job. Ogni job inizialmente si occuperà di renderizzare alcuni pixel dell'immagine. In futuro questi schemi potrebbero cambiare, a seconda dell'algoritmo utilizzato per la generazione del pass, ma in ogni caso un job si occupa di creare un frammento di pass.
L'importanza di un job deriva dal fatto che ogni job è eseguito su un thread diverso, e quindi è possibile utilizzare più core o CPU o quant'altro, e che ogni job può essere virtualmente eseguito su un altro computer, e quindi dare un'altra possibilità di rendering distribuito.

Detto questo vi lascio, se riesco scriverò del codice già sabato (domani, o meglio oggi visto l'orario, avrò degli impegni e non penso che riuscirò a fare nulla, ma non si sa mai :D ).

Nessun commento: