Wednesday, January 04, 2006

Ambient() diffuse()

RSL tem algumas funcoes prontas que calculam a contribuicao da luz
no shader . adicionando iluminacao ambient, diffuse e specular
essas funcoes sao :

ambient()
diffuse()
specular()

algumas dessas funcoes precisam receber informacoes sobre a geometria para o calculo
,a funcao ambient() é a mais simples em geral usada sem argumentos adicionais, mas
ja a diffuse() precisa de uma normal com comprimento maximo de 1 apontada para a direcao contraria
do Observador . confuso ne ! . eu tbm acho ! mas seguindo a relacao de funcoes e variaveis globais vc
vai descobrir que N = normal de um objeto, I = vetor do observador, e que a funcao normalize(), converte
o comprimento de um vetor em um valor entre 0 e 1 e finalmente a funcao faceforward() inverte a direcao
da normal para aprontar na direcao contraria do observador no Ponto de vista do shader .
entao no final fica assim

faceforward(normalize(N),I) ;


essa pequena funcao vai retornar um a normal do ponto a ser calculado com comprimento de no maximo 1 apontada para o observador
vamos guardar isso em uma variavel do tipo normals .

normal Nf = faceforward(normalize(N),I) ;


bem agora que achamos a informacao que precisamos . é so adicionar isso como um argumento
na funcao diffuse() .

diffuse(Nf)

aplicando tudo isso em um shader :

surface
meushader( color verde = (0.0 , 1.0 , 0.0 ) ; )
{
normal Nf = faceforward(normalize(N),I);
Oi = Os ;
Ci = Os * verde *(ambient()+ diffuse(Nf));
}


copile e teste !!
t+

No comments: