|
Há alguns dias, li o ‘Application Note #35’ do RAT sobre Ambient Occlusion, ImageBased Ilumination e Global Illumination; acabei fazendo alguns testes e resolvi colocar aqui um resumo do que li e testei.
O que chamamos de occlusion é uma aproximação do cálculo de uma sombra de contato difusa. Ele é feito através do cálculo por ponto de quanto do hemisfério acima é coberto por outros objetos.
No RenderMan podemos calcular o occlusion de duas formas: utilizando um “gather loop” ou a função pré-definida “occlusion”.
O primeiro shader, occlgather.sl, utiliza um “gather loop”. Para cada shading point ele projeta raios (quantidade especificada no atributo samples) em direções randomicas no hemisfério. Para cada raio que acerta um objeto, a variável hits é incrementada. Depois do looping, o occlusion é computado dividindo o número de hits pelos samples. Quanto mais raios (samples), mais qualidade (menos ruído), mas o cálculo acaba sendo mais demorado.
Normalmente, a sombra de contato varia muito pouco em posições distantes de outros objetos. Nestas posições, o cálculo em cada shading point acaba sendo um grande desperdício. Neste caso, a forma mais eficiente de fazer o cálculo, é simplesmente calcular nos cantos do micropolígono e fazer a interpolação nos outros shading points. É neste conceito que se baseia a função occlusion.
O segundo shader, occlfunction.sl, utiliza a função occlusion. Neste, através do atributo maxvariation controla-se o tradeoff entre qualidade e velocidade no cálculo. Quanto maior for o valor de maxvariation, mais interpolação vai ocorrer e mais rápido será o render. Se maxvariation for 0, o cálculo é feito em cada shading point sem nenhuma interpolação, como se fosse um “gather loop”. Com valores maiores que 0 a interpolação é realizada. Valores entre 1 e 10 são comumente utilizados para rápidos previews (quanto maior o valor, maior a probabilidade de “flickering”); já para renders finais, os valores ficam entre 0.01 e 0.1.
Esta função, além de receber como parâmetros o ponto (P), sua normal na superfície (Ns) e o número de raios a serem emitidos (samples), também recebe duplas de parâmetros opcionais, como por exemplo, o maxvariation e o seu respectivo valor. Utilizando estes parâmetros conseguimos especializar e otimizar ainda mais o cálculo do occlusion.
Além do maxvariation, existem aproximadamente outros vinte parâmetros, dentre eles, vale a pena citar:
- maxdist: distância em que um ponto pode causar occlusion; quanto menor o valor mais local o efeito;
- coneangle: ângulo do hemisfério acima do ponto a ser considerado; o default é de 180 graus (pi/2). Quanto menor o ângulo mais “duro” é o efeito. Na Env Light do RfM coneangle é chamado de Diffuse Softness sendo o valor de 1 igual a 180 graus.
- hitmode: determina se a transparência deve ser levada em consideração para cálculo de occlusion. Para objetos transparentes use hitmode com o valor “shader”.
|
Este ajuste pode ser feito tanto no shader ou localmente por superfície. No RfM, se estivermos usando uma Env Light só podemos fazer este ajuste por superfície. Para isto basta selecionar a superfície, adicionar o atributo do Renderman “Diffuse Ray Shading” e ajustar o seu valor para “shader”. A figura ao lado ilustra o resultado com o hitmode em “default” e em “shader”.
Abaixo estão três imagens para comparação de qualidade e tempo, feitas com os dois shaders de occlusion.