Blog

Correzione bug depth pass nei Render Proxy

immagine conigli render proxy e depth pass

Gli Assembly di mental ray (detti anche Render Proxy) sono uno strumento per caricare determinati oggetti on-demand durante il rendering e sono perciò estremamente efficienti dal punto di vista della gestione della memoria.

Il concetto è molto simile a quello dei mental ray proxy, ma sono da considerarsi come un loro miglioramento sia perchè sono ancora più efficaci, sia perché la loro gestione è integrata nell'UI di Maya.
Con gli Assembly ad esempio è possibile esportare gruppi di oggetti in un unico file, scegliendo se includere anche gli shaders, cosa non possibile con i semplici proxy, i quali invece prendono il loro materiale dall'oggetto standin che li richiama.

Sfortunatamente, fin dalla loro prima implementazione, i Render Proxy sono afflitti da un bug che ne compromette in parte l'usabilità, e cioè non compaiono in alcuni passi (conosciuti anche come framebuffer), come per esempio il camera depth.

Alcuni modelli di conigli creati tramite render proxy

Alcuni modelli di conigli creati tramite render proxy

depth pass che viene prodotto di default dai render proxy

Il depth pass che viene prodotto di default dai render proxy: le informazioni dei modelli non compaiono

Ad oggi, alla versione 2015, usando come shader il mia_material_x_passes, il bug non è ancora stato risolto. Probabilmente con il passaggio ai mila_material, con relativo utilizzo del sistema LPE per generare i framebuffer, il problema non sussiterà più.
Tuttavia, fino a quando l'utilizzo dei mila_materia non sostituirà completamente il vecchio workflow con mia_material e l'attuale pass system, sarà utile cercare di risolvere il problema.
In questo articolo descrivo appunto alcuni modi per farlo.

Ma prima, per amore di completezza...

Come creare un Render Proxy

  • Selezionare gli oggetti desiderati, file > export selection > options;
  • Come Files of Type impostare mental ray;
  • Sotto file type specific options > export selection output scegliere Render Proxy (Assembly);
  • Cliccare su export selection;
finestra di dialogo per l'esportazione di un Assembly

La finestra di dialogo per l'esportazione di un Assembly

  • Viene creato un file .mi che dovrà essere caricato nella shape di un oggetto standin nella sezione mental ray > render proxy;
  • L'oggetto verrà scalato per rispecchiare il bounding box dell'Assembly e sarà pronto per essere renderizzato.
Immagine oggetti stand-in in viewport una volta associati con l'Assembly

Come appaiono gli oggetti stand-in in viewport una volta associati con l'Assembly

Ricreare il Problema

Assegniamo ora alcuni passi al master layer, diffuse, reflection e camera depth, ad esempio.
Vedrete che mentre i primi due escono senza problemi, il terzo invece presenta una sagoma nera nel posto dell'Assembly.

Due possibili soluzioni

La prima e più semplice, prevede semplicemente di disabilitare al momento dell'esportazione l'opzione export materials.

finestra di esportazione con disabilitata l'opzione export material

La finestra di esportazione con disabilitata l'opzione export material

In questo modo non verranno inclusi gli shader all'interno del file .mi e il materiale verrà quindi derivato da quello assegnato all'oggetto stand-in.
Il problema di questa tecnica insorge quando il modello che si vuole convertire in Render Proxy è costituito da più oggetti a cui sono assegnati shader diversi, come può essere per esempio un albero, con tronco e foglie descritti da materiali ovviamente diversi. In questo caso, sarebbe necessario creare due Render Proxy separati ed assegnare ai rispettivi modelli stand-in i diversi materiali. Soluzione non esattamente pratica, soprattutto all'aumentare del numero di oggetti che costituiscono il modello.

La seconda soluzione prevede l'editing manuale del file .mi.
Infatti, come viene spiegato in questo post, l'exporter di maya per qualche motivo non scrive all'interno dell'assembly ShadingGroup il richiamo allo shader adskPassCameraDepth.

Dovremmo quindi, ahimè, editare il file a mano. Tranquilli, è più semplice di quello che ci si immagina.

Innanzitutto bisogna esportare il file in formato ASCII in maniera che sia modificabile con un editor.

finestra di esportazione con opzione ASCII.

L'opzione di esportazione del file in formato ASCII

Una volta aperto il file con un text editor, dobbiamo cercare la sezione material, che è quella che descrive lo shading group del materiale.
Sarà simile a qualcosa del genere:

material "mia_material_x_passes2SG"
	"adskMayaShadingEngine" (
	   "surfaceShader" = "mia_material_x_passes2.result",
	   "cutAwayOpacity" 0.,
	   "customShader" on
	   )
	shadow = "mia_material_x_passes2"
	photon = "mia_material_x_passes2"
end material

Ora non dobbiamo fare altro che aggiungere prima di shadow queste righe:

"adskPassCameraDepth" (
		"frameBufferNumber" 0,
		"encodingIndex" 0,
		"holdout" off,
		"useShadingEngineThreshold" off,
		"transparencyThreshold" 0.,
		"remap" off,
		"znear" 0.,
		"zfar" 1000.,
		"minbuffer" 0.,
		"maxbuffer" 1.
		)

La sezione completa sarà quindi:

material "mia_material_x_passes2SG"
	"adskMayaShadingEngine" (
	   "surfaceShader" = "mia_material_x_passes2.result",
	   "cutAwayOpacity" 0.,
	   "customShader" on
	   )
	   "adskPassCameraDepth" (
	   "frameBufferNumber" 0,
	   "encodingIndex" 0,
	   "holdout" off,
	   "useShadingEngineThreshold" off,
	   "transparencyThreshold" 0.,
	   "remap" off,
	   "znear" 0.,
	   "zfar" 1000.,
	   "minbuffer" 0.,
	   "maxbuffer" 1.
	   )
	shadow = "mia_material_x_passes2"
	photon = "mia_material_x_passes2"
end material

Nel caso il modello presenti più materiali dovremo ripetere questa operazioni per ciascuno di questi, cercandoli nei diversi punti del file .mi

Renderizzando ora la stessa scena vediamo che il depth pass viene prodotto correttamente.

immagine del depth pass corretto

Il depth pass ora contiene le informazioni dei Render Proxy

Finalmente possiamo usare i Render Proxy in tutte le loro potenzialità per le normali operazioni di compositing!

Paolo Mazzoccato, fondatore Fisheye Studio

Paolo Mazzoccato

Fondatore di Fisheye Studio e appassionato di grafica 3d dal 1996. Quando la tecnologia mi volta le spalle trovo conforto nelle fusa dei miei gatti.

Linkedin

comments powered by Disqus