M aya por Gustavo L. Braga ACELERE SEU RENDER NO MAYA 2 Figura 1 - Cena exemplo sem nenhum tipo de otimização. INTRODUÇÃO A correta utilização do render é uma grande preocupação nos estúdios de animação 3D atualmente. Horas de máquina mal utilizadas em um render podem acabar facilmente com a viabilidade de um trabalho, ou ainda pior, acarretar em um atraso na entrega da animação para o cliente. Inúmeras vezes nos deparamos com uma data de entrega para um material e normalmente somos obrigados a adequar a cena ao tempo. O render do Maya é muito flexível a este tipo de adequação e oferece inúmeras maneiras de se otimizar uma cena melhorando o tempo de render sem perda de qualidade. Não é uma regra fazer a otimização depois de terminada a cena, sendo que todos os procedimentos dados neste artigo podem ser feitos durante as fases de modelagem e iluminação/texturização. Os procedimentos estão divididos por área de abrangência, o que facilita a localização no caso de uma busca futura. A CENA A imagem que usaremos como exemplo (figura 1) faz parte de uma animação onde um espremedor de frutas, espreme o limão e o arremessa em direção a tela. Através desta imagem será demonstrado, quando aplicável, o resultado de diversas formas de otimização, além dos problemas típicos que acontecem quando alguns atributos têm seus valores modificados de maneira incorreta. TESTANDO A CENA Após termos trabalhado os processos usuais de produção e chegarmos a um resultado satisfatório para a cena, o primeiro passo da otimização é rodar o comando File>Optimize Scene Size. Este comando remove elementos sem uso ou inválidos na cena e o seu resultado é mostrado no Script Editor (Window > General Editors > Script Editor). Como no exemplo da Figura 2 onde foram apagados diversos nós de materiais e de posicionamento de textura que não estavam sendo utilizados. O próximo passo é executar o comando Render Diagnostics (Render > Render Diagnostics). Este comando faz vários testes para diagnosticar algumas incoerências nos ajustes para o render. Os resultados destes testes são mostrados 36 ED13 - Outubro 99 na forma de warnings e conselhos no Script Editor como mostrado na Figura 3. Estes resultados nos ajudarão a guiar os próximos passos da otimização. LUZES E SOMBRAS Com relação as luzes, o principal é: fazer o link das superfícies somente com as luzes que as afetam diretamente. Quando é criada uma luz, esta iluminará todas as superfícies na sua cena e da mesma forma, quanto é criada uma superfície nova, todas as luzes da cena irão iluminá-la. Para fazer o "link" da luz com as texturas e/ou superfícies usamos o Relationship Editor (Windows > Relationship Editors > Light Linking). Na cena de exemplo, temos para cada Shading Group luzes lincadas (figura 4). Para calcular a sombra, sempre é mais rápido o cálculo através das sombras Depth Map. Sombras em raytracing só devem ser usadas para objetos transparentes. Um fator importante é notar quais superfícies realmente precisam fazer sombra na cena. Para as superfícies onde a sombra é desnecessária desligue a opção Cast Shadows. Figura 2 - Script Editor com o resultado do comando Optimize Scene Size. www.digitaldesigner.com.br Para o cálculo das sombras Depth Map o Maya calcula o mapa de profundidade para cada luz a cada frame da animação durante o render. As sombras podem ser geradas antes do render e salvas no diretório depth do seu projeto o que, além de diminuir o tempo de render, torna as sombras reutilizáveis desde que não haja mudança na animação das luzes e objetos. No quadro abaixo estão algumas situações onde podemos otimizar o uso das sombras Depth Map. Figura 3 - Script Editor com o resultado do comando Render Diagnostics. 37 Figura 4 - Relationship Editor mostrando os "links" das luzes com os Shading Groups. Figura 5 - Cena com sombras Depth Map. 38 Se você está ... Ajuste o atributo ... ... renderizando um único frame várias vezes, sendo que em cada render estão sendo feitos ajustes somente nas propriedades das luzes e dos objetos e NÃO está movendo luzes nem objetos. O mapa de profundidade não mudará e poderá ser reutilizado. ... Disk Based Dmaps para Reuse Existing Dmap(s). O Maya vai calcular o mapa de profundidade na primeira vez que você renderizar e salvar em disco. Nas próximas vezes o mapa será reutilizado ... renderizando uma animação em que a luz e os objetos que são iluminadas por elas NÃO se movem. Por exemplo: A câmera movendo-se em um cenário. O mapa de profundidade não mudará de um frame para outro e pode ser reutilizável. ... Disk Based Dmaps para Reuse Existing Dmap(s) e desligue a opção Dmap Frame Ext. O Maya irá calcular o mapa de profundidade na primeiro frame da animação e este será reutilizado para os frames seguintes. ... renderizando um frame ou uma animação, que tem seu mapa de animação salvo em disco e as luzes ou objetos foram movidos, o mapa de profundidade NÃO poderá ser reutilizado ... Disk Based Dmaps para Overwrite e renderize o quadro novamente. O Maya irá calcular e sobrescrever o mapa de profundidade salvo em disco. Se ainda for necessário ajustes na cena, ajuste novamente o atributo Disk Based Dmaps para Reuse Existing Dmap(s). Além da reutilização dos mapas de profundidade ainda podemos otimizar os cálculos para geração da sombra. Na seção Depth Map Shadows dentro de cada luz existem várias opções para otimização. O que mais afeta a qualidade e o tempo de cálculo são os atributos Dmap Resolution e Dmap Filter Size, respectivamente a resolução do mapa de profundidade e o tamanho do filtro de suavização da sombra. O atributo Dmap Resolution é relacionado à resolução do mapa de profundidade. Se o valor para este atributo é baixo a borda da sombra ficará mal definida, com aparência granulada e haverá "flicker" durante a animação. Um valor inicial bom é o maior valor da resolução da imagem final. Por exemplo: uma imagem de 640x480, o valor inicial para testes é de 640, normalmente quando a cena é animada este valor é o mínimo necessário para que não aconteçam problemas. Já o Dmap Filter Size controla a suavidade da borda, quanto maior o valor mais suave a borda da sombra e também mais lento será o render. Quando usamos point lights é possível uma customização ainda maior. Dependendo do posicionamento das Point Lights usadas na cena não é necessário que a luz produza sombras em todas as direções X, Y e Z. Desligue as direções que não são necessárias na seção Dmap Attributes (X+Dmap, X-Dmap, Y+Dmap, Y-Dmap, Z+Dmap, ZDmap). ED13 - Outubro 99 Para a figura 5 em relação a figura 1 foram trocadas as sombras em ray tracing para Depth Map. Como a imagem foi renderizada em 720x486 para uma animação, foi usado o valor de 800 para o Dmap Resolution . Foi usado o valor de 3 para o Dmap Filter, suavizando assim a borda da sombra. SUPERFÍCIES Quando a cena estiver pronta para o render devemos apagar o histórico de construção das superfícies onde o histórico é desnecessário. Isto evita cálculos desnecessários a cada frame. Outro procedimento é transformar as superfícies que não serão visualizadas por dentro em single sided surfaces. Para fazer isto desligue a opção Double sided surfaces no Attribute Editor de cada superfície. O mais importante quando se comenta em otimização de superfícies é o número de triângulos que a superfície será dividida durante a fase de tecelagem da superfície para o render. Quanto maior o número de triângulos, mais perfeito é o render do objeto, porém o tempo também crescerá proporcionalmente a este aumento. Nesta etapa o fundamental é conseguir diminuir ao máximo o número de triângulos sem que haja um facetamento visível da superfície. Figura 6a - Visualização de como será a tecelagem do ralador no render. Figura 6b - Render do ralador com facetamento devido ao pequeno número de triângulos. Figura 7a - Visualização da uma nova tecelagem, agora com mais triângulos. Figura 7b - Render do ralador sem nenhum tipo de facetamento. www.digitaldesigner.com.br 39 MOTION BLUR Figura 8 - Textura do limão criada no Studio Paint 3D. O Motion Blur é calculado baseado no ângulo de abertura da câmera e na movimentação do objeto de um frame para o outro. No Maya 2 foi introduzido mais um algoritmo para o cálculo do Motion Blur, o 2D Motion Blur (Window>Render Globals, seção Motion Blur). Este novo método é uma maneira muito mais rápida de calcular o motion blur, através de um maneira aproximada e que pode ser usado com ótimos resultados em quase todas as situações. Podemos ainda diminuir o tempo de cálculo não renderizando toda a cena com o motion blur. Renderizando separadamente somente os objetos que queremos que recebam o motion blur agilizará o cálculo, devido ao fato do render não precisar calcular a movimentação de objetos que não receberão o motion blur. Também influi no tempo de cálculo o valor do atributo Blur by Frame (Window>Render Globals, seção Motion Blur) que define o número de quadros anteriores que serão levados em conta para o cálculo do motion blur no quadro atual. Por exemplo: Blur by Frame com valor 3, a movimentação dos últimos três quadros ao atual é computada. Quanto maior o valor de frames mais demorado é o cálculo do motion blur. TEXTURAS Figura 9 - Cena Final com todas as otimizações e sem perda de qualidade. No Maya, quando estamos trabalhando em Shaded Mode, podemos visualizar como uma superfície será dividida ligando a opção Display Render Tesselation, na divisão Tesselation no Attribute Editor. Para alterar a qualidade da tecelagem altere os atributos U e V Divisions Factor. Como exemplo podemos comparar as figuras 6a e 6b onde temos o ralador com um número insuficiente de triângulos (ocorrendo o facetamento no render - figura 6b), com as figuras 7a e 7b onde o número de triângulos é suficiente e não há nenhum sinal de facetamento na figura 7b. Aplicar a maior e mais detalhada textura possível a uma geometria normalmente é um exagero que cometemos sem perceber. Este exagero acarreta normalmente uma maior demora no render sem que tenhamos diferença na imagem final. Objetos que estão em segundo plano e que ocupam uma área reduzida na imagem final não necessitam de um arquivo com uma resolução grande. Na cena exemplo, temos a textura do limão (figura 8) que é um arquivo de 512x512 pixels e mesmo tendo um tamanho reduzido não acarreta nenhum problema de detalhe no limão. Transformar as texturas procedurais em arquivos através do comando Convert Solid Texture também ajuda a melhorar o desempenho do render. Além de transformar estas texturas procedurais em arquivos, devemos transformar todos os arquivos de textura em arquivos BOT (block ordered texture) e ligar o atributo Use Cache para cada arquivo. Arquivos BOT são o formato comprimido nativo que o Maya usa para fazer o cache de textura, possibilitando o rápido carregamento de retângulos da imagem quando necessários durante o processo de render. Caso as imagens não sejam transformadas em BOT antes do render, toda vez que a textura for para o cache ela terá que ser transformada em BOT pelo render. 40 ED13 - Outubro 99 RAY TRACING Os atributos que influem bastante no tempo do ray tracing são os que definem a qualidade das reflexões, refrações e sombra (Window>Render Globals, seção Raytracing Quality). A melhor forma de ajustar estes atributos é achar o menor valor que faça com que a imagem final tenha a qua-lidade de reflexão e refração desejada. A imagem do exemplo foi renderizada com valores de reflexão 4 (o valor do atributo Shadows não afeta o tempo deste render devido ao fato de terem sido usadas sombras Depth Map). DEFINIÇÕES DO RENDER O Maya tem como formato padrão de imagens o Maya iff e o sgi. Todo o render que tiver como imagem final um destes dois formatos será mais rápido, devido ao fato do Maya não precisar fazer nenhum tipo de conversão. Renderizando elementos de uma cena separadamente pode levar menos tempo do que renderizando a cena completa em um somente um passo. Além disto, podem ser feitos ajustes finos depois do render em cada camada e caso ocorra algum problema só será necessário renderizar novamente a camada com problema. Finalmente, quando for renderizar uma animação o faça no shell. Feche todos os programas inclusive o Maya e deixe executando somente o shell que contém o render. No IRIX ainda podemos rodar o processo do render em background usando o operador & e dar logout da máquina para liberar ainda mais memória. de animação. Normalmente conseguimos diminuir de 10% a 30% o tempo do render por quadro sem perda de qualidade na imagem final, somente seguindo estes procedimentos. Na nossa imagem exemplo o render sem otimização demorou 17 minutos e 32 segundos e o render com a cena otimizada (figura 9) demorou 12 minutos e 10 segundos, uma melhora de aproximadamente 30%. Os procedimentos acima dão ganhos de desempenho diferentes em cada cena e alguns só se aplicam em algumas situações por isso sempre reserve um tempinho para testes de otimização antes de começar um render grande. CONCLUSÃO O quanto vamos ganhar otimizando uma cena depende de como ela foi construída e quanto tempo teremos Gustavo L. Braga é diretor técnico na Amazing Graphics do Brasil, empresa de computação gráfica e efeitos especiais. Você pode encontrá-lo através do e-mail: [email protected] 41 www.digitaldesigner.com.br