Tuesday, July 10, 2007

Raytracing e gather()

A funcao gather() produz um looping para capturar informacoes via raytracing , ele 'e usado para capturar informacoes do shader que o raio atinge a cada looping .. como ele tem uma emissao de multiplos raios em um certo angulo ele 'e ideal para produzir reflexoes com blur e outros truques com raytracing .

a sintaxe da funcao gather:
gather ( string category, point P, vector dir, float angle, float samples, ... ) {statements} [else {statements}]

a funcao gather envia um cone de raios(samples) a partir do ponto P para a direcao "dir"em um determinado angulo "angle" . O angulo dado em radianos 'e medido a partir de "dir" .quanto maior o cone mais blur nos dados ou cores capturados , a qualidade desse blur 'e calculado pelo valor de samples . Quando um raio atinge uma surface ele captura informacoes diversas que podem ser escolhidas entre as variaveis globais do renderman ou uma informacao customizada do shader, a cada looping ele acumula as informacoes sobre as superficies. Uma media total das informacoes desses loopings 'e feita fora do looping , e adicionado no resultado final do seu shader , como voce pode ver existem dois blocos de statements , o primeiro blocovai ser executado quando o raio atingir uma surface e o codigo no bloco do "else" vai ser executado quando nao for atingida nenhuma superficie , o parametro "maxdist" limita os raios em uma certa distancia excluindo objetos fora desse campo .. muito bom para
dar uma optimizada no desempenho do raytracing
abaixo segue o codigo usando gather() :

/*----------------------------------------------------------------------------------*/
surface gatherReflex(
float samples = 1;

float coneAngulo = 0;

float maxdist = 1
)
{
/* inicia as variaveis para a cptura de informacoessbre a superficie e a cor do reflexo */
color hitColor = 0;

vector In = normalize(I);

normal Nn = normalize(N);

normal Nf = faceforward(Nn, In);

float numhits = 0;
Ci = 0;

/* verifica o angulo da surface em relacao ao observador */
if(Nn.-In >= 0)
{
vector ReflexDir = reflect(In, Nn); /* acha a direcao do reflexo */

/* inicia o gathering com as informacoes adquiridas , "surface:ci" vai ser a informacao capturado pelo raio ao bater em uma surface e adicionada na variavel hitcolor */


gather("illuminance", P, ReflexDir,coneAngulo,samples,"maxdist", maxdist, "surface:Ci",
hitColor)

{ Ci += hitColor; /* adiciona a cor capturada em Ci */

numhits += 1; /* conta o numero de raios que atingiram uma surface */

} else { hitColor = 0 ; }

}


/* calcula a media das cores pelo raios atingidos assinalado em Ci */
Ci /= numhits;
Oi = 1;}
/*-------------------------------------------------------------------------------------*/


um teste com samples 64 cone angle 0.18 e distancia 110




No comments: