Monday, July 09, 2007

trace() + etc..

segue um shader teste usando a trace() ambient() diffuse() specular()
o shader ainda nao me parece tao legal e tbm nao sei c a soma final das funcoes
esta feito do modo mais certo mas foi uma tentativa de juntar as funcoes

ai vai o shader :



surface mySurfReflex(
float Kspecular = .5 ;
float Kdifusse = .5 ;
float Kambiente = 1 ;
float Kroughness = .1;
float KReflex = 1 ;
color ambiente_color = 0 ;
color diffuse_color = .8 ;
color specular_color = .5 ;
)


{

/* cria variaveis para captura de informacoes sobre a superficie */
normal Nf;
vector V;
Nf = faceforward( normalize(N), I );
normal Nn = normalize(N);
vector In = normalize(I);
color Temp_reflex_color = 0 ;

/* inicializa os calculos difuse ambiente e especular e acha a direcao e cor da reflexao */
color Temp_ambiente_color = ambiente_color * Kambiente * ambient();
color Temp_diffuse_color = diffuse_color * Kdifusse * diffuse(Nf);
color Temp_specular_color = specular_color * Kspecular * specular(Nf,-In,Kroughness);

/* verifica o angulo entre a superficie e o observador */
if (Nn.-In >= 0) {
/* acha a direcao do reflexo entre a surface e o observador */
vector DirecaoReflex = reflect(Nn,In);
/*captura a cor do reflexo naquele ponto usando a funcao trace */
Temp_reflex_color = KReflex * trace(P, DirecaoReflex);
}

/* adiciona todas as informacoes achadas na cor final do shader*/
Oi = Os;
Ci = (Temp_ambiente_color + Temp_diffuse_color) + (Temp_specular_color + Temp_reflex_color);

/* premultiplica a cor final com a opacidade */
Ci *= Oi;

}





e uma imagem do shader aplicado :

No comments: