Iluminando o Cenário O realismo da cena é reforçada pela iluminação; A iluminação dos objetos cria a ilusão de volume: http://mech.fsv.cvut.cz/~dr/papers/habil/node51.html
Fundamentos: Fisicamente: a percepção da iluminação depende da distribuição da energia (dos fótons) que alcançam as células (cones/bastonetes) nos nossos olhos Essa energia se distribui de maneira complexa. Os fótons podem vir de uma fonte De luz ou combinações de várias fontes; Parte dos fótons são absorvidos outros são refletidos pelos objetos;
A absorção ou reflexão dos fótons influenciam na percepção da Iluminação e também sofre influência de diversos fatores: A polidez da superfície: a luz é espalhada em função da suavidade e orientação da superfície; A cor da superfície: reflexão da cor da luz incidente; A intensidade da luz incidente: intensidade de brilho; Características dos raios de luz: paralelos entre si ou não A posição do observador;
Resumindo: a percepção de brilho e cor (iluminação) de uma cena depende...: - Das próprias fontes de luz; - Das propriedades dos materiais; - Da localização do observador e; - Da orientação das superfícies. Em CG são aplicados modelos que simulam o efeito físico real da iluminação em função desses fatores.
Em CG, especialmente em aplicações de tempo real, não é necessário uma iluminação perfeita. Em geral adota-se a renderização local onde cada polígono é pintado de maneira independente do outro. Realiza-se uma aproximação dos efeitos reais de iluminação por meio de modelos empíricos simples. Quanto mais realista for o modelo/estratégia (Ray Tracing por exemplo ) maior o custo computacional para o cálculo envolvendo todos os objetos e fontes de luz.
O modelo empírico a ser abordado considera as seguintes componentes: Luz Ambiente Luz Difusa Luz Especular Para uma fonte de Luz, a intensidade total refletida It em um ponto da superfície é determinada conforme a equação: It= Iambiente + Idifusa + Iespecular
Luz Ambiente Trata-se de uma luz que está tão espalhada no ambiente a ponto de ser impossível determinar a sua direção ou fonte ela parece vir de todas as direções. Funciona como uma luz residual de fundo. É invariável à posição do observador (câmera sintética)
Cálculo da Luz Ambiente (Iluminação ambiental) A percepção de brilho e cor (intensidade refletida) é calculada através da equação: I a= K a I Ka = refletividade em relação à luz ambiente (característica do material) I = intensidade de luz ambiental incidente
Luz Difusa A reflexão de luz difusa é proporcional ao cos(θi) Sendo L (direção para a fonte de luz difusa) e N (a normal à superfície) dois vetores unitários, então: cos(θi)=l.n Levando em conta o material e a intensidade da luz difusa, teremos... I d =K d N L I
Luz Difusa Luz difusa refletida: I d = K d N L I Kd= refletividade da luz difusa; I = intensidade da luz incidente; L = vetor unitário orientado para a fonte de luz difusa; N = normal (unitária) no ponto da superfície que recebe a luz difusa.
Luz Difusa Surge o efeito de sombra em função da direção da luz em relação à normal. Se θ aumenta tendendo para 90o então proporcionalmente o cos(θ) decai e ocorre a formação de um gradiente de sombra.
Luz Difusa Se θ aumenta tendendo para 90o então, proporcionalmente, o cos(θ) decai e ocorre a formação de um gradiente de sombra. θ1 θ2 A B θ2 > θ1 reflexão menor mais sombra em B do que em A
Luz Difusa A reflexão da luz difusa depende apenas do ângulo θ de incidência. Independente da posição do observador a luz difusa no ponto P é percebida de maneira constante
Luz Difusa Uma superfície Lambertiana espalha a luz em todas as direções apresentando brilho perfeitamente uniforme. O gesso é uma superfície quase Lambertiana Quanto mais constante for a luz difusa mais lambertiana é a o material da superfície
Luz Especular (modelo empírico de Phong) A luz especular produz o efeito de reflexão em uma superfície polida, onde a luz incidente se reflete com mais intensidade em certo ponto do objeto. O brilho é mais intenso nesse ponto (reflexão perfeita) e decai ao redor dele.
Luz Especular (modelo Phong) A intensidade de luz especular refletida depende da posição do observador (câmera sintética) O decaimento da luz especular varia com o (cos(α )) n
Luz Especular (modelo Phong) A intensidade refletida é proporcional a cos n (α ) (cos(α )) n
Luz Especular (modelo Phong) n n Se R e V são unitários então cos(α ) = ( R V ) I e = ke I ( R V ) n R = 2 N ( N L) L k e = coeficiente de reflexão especular I = intensidade da luz especular incidente R = direção de reflexão da luz especular V = direção do observador n = shininess N = vetor normal L = direção da fonte de luz especular
shininess = 50 shininess = 1 shininess = 10
Luz Especular (modelo Blinn) Ao aplicar Phong para cálculo da iluminação especular, é necessário executar R.V para cada ponto da superfície, substituindo R.V por N.H reduz-se o custo do cálculo de R
É importante salientar: Na prática, It tem que ser calculada para cada componente R, G e B e também para cada fonte de luz (pode existir mais de uma fonte)
Relembrando os principais fatores que influenciam na percepção de iluminação (reflexão da luz): Características dos materiais: As superfícies podem ser mais ou menos polídas o que influencia na reflexão mais ou menos difusa ou especular. Características das fontes de luz Além disso as fontes de luz podem ser posicionais/spots (raios não paralelos) ou direcionais (raios paralelos); O Opengl parametriza as características do material e/ou da fonte de luz através das funções: glmaterial* e gllight*.
É importante salientar: Há também a atenuação f(d) causada pela distância da fonte de iluminação. Este fator pode ser linear constante ou quadrático: f(d)=1/(a+b.d+c.d2) d=distância a=fator constante b.d= fator linear c.d2=fator quadrático
Até aqui vimos o Modelo Empírico que calcula a iluminação. A tonalização é a aplicação deste modelo sobre os polígonos que formam as superfícies da cena... A tonalização pode ocorrer das seguintes formas: Facetado (FLAT); Suave (SMOOTH) Gourald Phong
Tonalização Facetada (a mais simples) cada polígono da superfície recebe a iluminação calculada para um ponto. Ou seja, calcula-se a iluminação apenas uma vez e aplica-se ao polígono em questão.
shininess= 3 FLAT (facetado)
Tonalização Suave - Gouraud A iluminação é calculada para cada vértice do polígono; A iluminação de cada ponto na superfície do polígono é determinada por interpolação bilinear tomando como referência os valores de iluminação calculados nos vértices do polígono.
Tonalização Suave - Gouraud
SMOOTH GOURAUD
OpenGL: Facetado e suave-gourald glshademodel(gl_flat); glshademodel(gl_smooth);
Tonalização Suave - Phong As normais em uma aresta são Interpoladas a partir dos vértices desta aresta. As normais internas são interpolação bilinear do par de normais calculadas em arestas.
Tonalização Suave - Phong A iluminação de cada ponto do polígono pode ser calculada a partir das normais interpoladas n(α ) = (1 α )na + α nb n(α, β ) = (1 β )nc + β nd
Tonalização Suave - Phong A tonalização de Phong é melhor que a de Gouraud porém, é computacionalmente mais cara.
Execute os seguintes programas identificando a prametrização da iluminação: www.opengl.org/resources/code/samples/redbook/material.c www.opengl.org/resources/code/samples/redbook/colormat.c Fonte: Code samples for the OpenGL v1.1 Programming Guide (Redbook)
Exercício1:
Dados do exercício 1: Vetores normais (normas unitárias): N1,N2,N3 e N4; As intensidades refletidas das componentes de luz são unitárias; A única fonte de luz é branca, R=1,G=1,B=1 para todos os componentes: ambiental, especular e difuso. Dessa forma, a cor do objeto será percebida (determinada) pelos coeficientes (K) dos materiais; Os coeficientes de reflexão Ka=Kd=Ke são conhecidos e iguais a (1,1,0); Shininess da componente especular: n=128; A reflexão da componente especular é calculada pelo modelo de Phong; Utilizar o modelo de tonalização de Gouraud: interpolação das iluminações calculadas nos vértices;
Dados do exercício 1: A fonte de luz é direcional, na direção do vetor D=(0,0,-1): fonte no infinito, raios paralelos; O vetor L de direção para a fonte de luz é L=-D;
Dados do exercício 1: Considere a direção de observação (V) coincidente com a direção de reflexão (R), portanto R.V=R.R=1
calcular a iluminação em cada vértice e interpolar a iluminação no ponto p: Solução exercício 1: Primeiro calcula-se a iluminação em V1 v1 v1 v1 v1 I t = I a + I + I esp d v2 v3 v4 O mesmo para I t, I t e I t Após isso é feita a interpolação bilinear :
Solução exercício 1: Componente ambiental em v1 : v v I a1 = I k a1 = 1 (1,1,0) = (1,1,0) Componente difusa em v1 : L = D = (0,0, 1) v v I 1 = k 1 I ( N v1 L) d d 1 1 1 v1 (0,0,1) I = (1,1,0) 1,, d 3 3 3 1 v1 1 I =,,0 d 3 3
Solução exercício 1: Componente especular em v1 : R v1 = 2 N v1 ( N v1 L) L = 1 1 1 1 1 1 (0,0,1) 0,0,1) 2,,,, 3 3 3 3 3 3 2 2 1 v 1 R =,, 3 3 3 v1 v1 I esp = k esp I ( R v1 V v1 ) n v1 v1 I esp = k esp I ( R v1 V v1 ) n v1 v1 I esp = k esp I ( R v1 R v1 ) n v1 I esp = (1,1,0) 1 1128 = (1,1,0)
Solução exercício 1: Iluminação em v1 : I v1 v1 v1 v1 = I + I + I = ambiental difusa especular 1 1 (1,1,0) +,,0 + (1,1,0) (2,58; 2,58; 0) 3 3
Solução exercício 1: Realize os demais cálculos e confirme que : I v1 = I v2 = I v3 = I v4 (2,58; 2,58; 0)
Solução exercício 1: Após calcular a iluminação para cada vértice aplique as equações de interpolação levando em conta as coordenadas dos vértices, as coordenadas
Exercício 2: Resolva a questão anterior aplicando a tonalização de Phong
Exercício 3: Considerando o seguinte trecho de código, qual a intensidade da luz incidindo no ponto P(17,1,-200): GLfloat w[ ]={1,1,1,1}; Glfloat b[ ]= {0,0,0,1}; Glfloat p[ ] = {0,0,10,1}; Glfloat d[ ]={0,0,0,1}; glenable(gl_lighting); glenable(gl_light0); gllightfv(gl_light0,gl_ambient,b); gllightfv(gl_light0,gl_diffuse,w); gllightfv(gl_light0,gl_specular,b); gllightfv(gl_light0,gl_position,p); gllightfv(gl_light0,gl_spot_direction,d); gllightfv(gl_light0,gl_spot_cutoff,180.0); gllightfv(gl_light0,gl_spot_exponent,128); falloff
Solução do Exercício 3: Deseja-se a intensidade da luz incidente sobre o ponto P Na incidência sobre o material: as luzes especular e ambiente estão praticamente desligadas (cor preta), há apenas uma componente difusa. I refletidadifusa = I incidentedifusa ( N L )
Solução do Exercício 3: qual é a IincidenteDifusa? A fonte de luz foi parametrizada para o formato SPOT, então a intensidade da luz incidente IincidenteDifusa é proporcional ao cosseno, elevado ao expoente 128, do ângulo de fall-off. Os cálculos de L e D constam nos próximos slides... n L D I incidentedifusa = ( cosα ) n = L D 128 L D I incidentedifusa = 0,0131 L D
Solução do Exercício 3: calculando L e D cos(θ ) = A B Esse racíocinio é aplicado em relação ao vetor direção D e o vetor L porém utilizando ( D) e L para que as origens dos dois vetores coincidam no ponto de origem da fonte de luz (ponto p [ 0,0,-190 ] T ). Dessa forma : L = p P = [0,0, 190]T [1,1, 200]T = [ 17, 1,10]T L = ( 17) 2 + ( 1) 2 + (10) 2 = 390 T 2 2, o vetor de direção é dado. D=,0, 2 2 D = 2 2 2 2 2 + 0 + 2 2 = 1, D já é um vetor normalizado.
Solução do Exercício 3: calculando L e D Da trigonometria, se A e B são vetores de mesma origem, e formam A B um ângulo θ, então : A B = A B cos(θ ) cos(θ ) =, A B Se, além disso, A e B são vetores normalizados, teremos : cos(θ ) = A B.
Exercício 4: Execute o seguinte trecho de código e teça comentários sobre o resultado da iluminação obtida (crie o objeto a ser iluminado). Descreva o papel dos parâmetros especificados por mat_shininess e GL_SPOT_EXPONENT? void init(void) { GLfloat mat_specular[ ] = {0.0, 0.0, 0.0, 1.0 }; GLfloat mat_diffuse[ ] ={0.0, 0.0, 0.0, 1.0 }; GLfloat mat_environmental[ ] = {0.0, 1.0, 0.0, 1.0 }; GLfloat mat_shininess[ ] ={3}; fallglfloat light_position[ ] = { 1.0, 0.0, 0.0, 1.0 }; off GLfloat light_specdirection[ ] = { 1.0, 0.0, 1.0, 1.0 }; glclearcolor (0.0, 0.0, 0.0, 0.0); glshademodel(gl_smooth); glmaterialfv(gl_front, GL_SPECULAR, mat_specular); glmaterialfv(gl_front, GL_SHININESS, mat_shininess); glmaterialfv(gl_front, GL_DIFFUSE, mat_diffuse); glmaterialfv(gl_front, GL_AMBIENT, mat_environmental); gllightfv(gl_light0, GL_POSITION, light_position); gllightfv(gl_light0, GL_SPOT_DIRECTION, light_specdirection); gllightf(gl_light0,gl_spot_cutoff,100.0); gl Lightf(GL_LIGHT0,GL_SPOT_EXPONENT,128); glenable(gl_lighting); glenable(gl_light0); glenable(gl_depth_test); }
Exercício 5: 1A)Determine a componente difusa da luz de intensidade (200;100;50) colocada na posição (0;1;0;0) sobre o vértice A do triângulo A=(3,2,1), B=(8,2,1), C=(4,8,-4). Utilize a regra da mão direita para a determinação da normal ao polígono. Kd=(0.6,0.5,0.3). Resp: L [0,1,0] Nn Ln =0.64 // Nn Normal normalizado e Ln vetor L normalizado Id=(76.8 32.0 9.6) 1B)Agora, considerando também uma componente ambiental com Ka=(1,1,1) e mesma intensidade, determine a Iluminação total no mesmo ponto A.
Exercício 6: 2A) Determine a componente especular de uma lâmpada de intensidade (1.0,0.4,1.0) colocada na posição (3,5,1,1) em relação ao ponto A=(6,2,1). O observador encontrase em (8,10,1), a normal N=(-1,2,0), material: Ke=(1,1,1) e n=8. A figura abaixo é uma ilustração geral e pode não retratar exatamente os parâmetros da questão: Resp: Rn=(-0.1394 0.9902 0) Vn=(0.242 0.97 0) Rn Vn=0.9267 Ie=(0.5437 0.2175 0.5437) 2B)Agora, considerando também uma componente ambiental com Kd=(0.6,0.7,0.6) e mesma intensidade determine a Iluminação total no mesmo ponto A