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
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;
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.
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.
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.
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.
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!