OpenGL Iluminação e sombreamento Sombreamento OpenGL calcula a cor de cada pixel e parte disso depende de qual é a iluminação usada no cenário e de como os objetos no cenário refletem ou absorvem a luz OpenGL trata a luz e a iluminação como se a luz pudesse ser dividida nas suas componentes Red, Green e Blue. Um modelo de iluminação pode ter várias fontes de luz que podem ser ligadas ou desligadas individualmente. A luz pode vir de uma posição ou direção particular ou ser espalhada pelo cenário. 1
Sombreamento No modelo OpenGL a luz só tem efeito se existem superfícies que absorvem e refletem a luz. O modelo considera a iluminação dividida em quatro componentes: Emissiva Ambiente Difusa Especular Sombreamento A cor que enxergamos depende de três fatores: As fontes de iluminação A inclinação das superfícies As propriedades dos materiais (reflexibilidade das superfícies) Cor da matéria Depende da percentagem de luz vermelha, verde e azul que a superfície recebe Os materiais têm diferentes reflectâncias para as luzes vermelha, azul e verde. As reflectâncias são combinadas com as componentes respectivas de cada fonte de luz. 2
Sombreamento A matéria tem também a cor emissiva que simula a cor originada a partir do objeto. Ela adiciona intensidade ao objeto, mas não afeta nenhuma fonte de luz. Para inserir iluminação em uma cena em OpenGL, são necessárias duas providências: - geração de uma Normal para cada face do objeto; - ativação da iluminação através da chamada da função: glenable(gl_lighting); // sem fontes, // os objetos serão gerados na cor // cinza Definição da cor da luz (ambiente, difusa e especular) glfloat light_ambient [ ] = {1.0, 1.0, 1.0, 1.0}; r g b Preferencialmente, esta cor deve ser branca(r=1,g=1,b=1)para permitir que todas as cores atribuídas ao objeto possam ser vistas. Se os valores de cor forem menores que 1, a luz diminuirá de intensidade. De forma similar, podem ser especificadas as luzes difusas e especulares: glfloat light_diffuse [ ] = {1.0, 1.0, 1.0, 1.0}; glfloat light_specular [ ] = {1.0, 1.0, 1.0, 1.0}; 3
Posição das fontes luminosas Para que uma fonte esteja localizada na cena, ela deve possuir uma posição na cena Para isso deve-se utilizar: glfloat light_position [ ] = {1.0, 1.0, 1.0, 1.0}; O quarto parâmetro desta tupla deve ser diferente de zero, para que a luz esteja dentro da cena; caso este parâmetro seja zero, a fonte é tratada como um spot (spotlight), ou seja, uma luz direcionada. glfloat light_position [ ] = {1.0, 1.0, 1.0, 0.0}; Ativar o uso da luz ambiente Para definir uma fonte como sendo de luz ambiente, pode-se definir: glligthfv(gl_light0,gl_ambient,light_ambient); Para ativar a fonte: glenable(gl_lighting); glenable(gl_light0); Para definir fontes de luz difusa e especular: glligthfv(gl_light1,gl_diffuse,light_diffuse); glligthfv(gl_light2,gl_specular,light_specular); 4
Definição de luzes direcionadas Fontes luminosas brilham em todas as direções, a menos que sejam definidas como spotlights. Para isso, o quarto parâmetro do comando lightposition deve ser zero. glfloat light_position [] = {1.0,1.0,1.0,0.0}; glligthfv(gl_light3,gl_position,light_position); Spots apresentam as características de direção e corte (cutoff) glligthf(gl_light3,gl_spot_direction,-1.0,-1.0, -1.0) ; glligthf(gl_light3,gl_spot_cutoff,30.0) ; cuttof direction Definição de luzes direcionadas A luz do spot pode ser atenuada em direção às bordas do ângulo de corte. Esta atenuação é modelada pelo parâmetro exponent. glligthf(gl_light3,gl_spot_exponent,2.0) ; 5
Posição e Atenuação A fonte pode estar infinitamente longe do cenário ou perto. A intensidade da luz decresce com a distância. Isto é importante quando se tem a luz posicional. O OpenGL atenua a fonte de luz por multiplicação da contribuição da fonte pelo fator de atenuação: 1/ (K c + K l d + K q d 2 ) onde: K c - GL_CONSTANT_ATTENUATION K l - GL_LINEAR_ATTENUATION K q - GL_QUADRATIC_ATTENUATION Definição da cor do material que constitui o objeto Para modelar a forma como a luz atua em um objeto é necessário definir como ele manipula a luz ambiente, difusa e especular. Isto equivale a definir a cor do objeto quando submetido a estas luzes: glfloat light_ambient [] = {1.0, 1.0, 1.0, 1.0}; // Define a cor da luz ambiente. glenable(gl_lighting); // Habilita o uso de iluminação gllightmodelfv(gl_light_model_ambient, light_ambient); // Ativa o uso da luz ambiente gl(gl_color_material); //Ativa o "Color Tracking" 6
Especificação dos materiais Cada polígono possui parte da frente e parte de trás. Estas duas faces podem ter cores diferentes. glfloatfv (GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE, mat_amb_diff); glfloat mat_amb_diff = {0.1,0.5,0.8,1.0}; glfloat white = {1.0,1.0,1.0,1.0}; glfloatfv (GL_FRONT,GL_DIFFUSE, white); glfloat black = {0.0,0.0,0.0,1.0}; glfloatfv (GL_BACK,GL_SPECULAR, black); Normais Normais são especificadas pelo comando glnormal Normais são associadas aos vértices A sequência natural de especificação é: glnormal, glvertex... Geralmente, deseja-se a normal com valor unitário: glenable (GL_NORMALIZE) glbegin(gl_polygon); // face posterior glnormal3f(0,0,1); // normal da face glvertex3f(10.0, 10.0, 10.0); glvertex3f(-10.0, 10.0, 10.0); glvertex3f(-10.0, -10.0, 10.0); glvertex3f(10.0, -10.0, 10.0); glend; 7
Blending (fusão) Permite combinar o valor da cor do fragmento que está sendo processado com o do pixel armazenado no framebuffer. O processo de fusão ocorre após a renderização da cena e sua conversão a fragmentos, mas antes que os pixels sejam desenhados no framebuffer. Para o processo de fusão utiliza-se os valores de α (opacidade alpha channel) do conjunto RGBA. O processo de fusão é base para: Transparência Composição digital Pintura Opacidade = 20% transmite 80% da luz Blending tratamento matemático s = source pixel origem fragmento (s r, s g, s b, s a ) Fator de fusão (blending) da origem: (b r, b g, b b, b a ) d = pixel destino - framebuffer (d r, d g, d b, d a ) Fator de fusão (blending) do destino: (c r, c g, c b, c a ) A operação de fusão produzirá d (d d) d = [b r s r + c r d r b g s g + c g d g b b s b + c b d b b a s a + c a d a ] Void glblendfunc (Glenum sfactor, Glenum dfactor) 8
Alguns valores que podem ser aplicados aos fatores de fusão Constante GL_ZERO GL_ONE GL_DST_COLOR GL_SRC_COLOR GL_ONE_MINUS_ DST_COLOR GL_ONE_MINUS_ SRC_COLOR Fator relevante source source valor (0, 0, 0, 0) (1, 1, 1, 1) (Rd, Gd, Bd, Ad) (Rs, Gs, Bs, As) (1, 1, 1, 1)-(Rd, Gd, Bd, Ad) (1, 1, 1, 1)-(Rs, Gs, Bs, As) Alguns valores que podem ser aplicados aos fatores de fusão Constante GL_SRC_ALPHA GL_ONE_MINUS _SRC_ALPHA GL_DST_ALPHA GL_ONE_MINUS _DST_ALPHA GL_SRC_ALPHA _SATURATE Fator relevante source valor (As, As, As, As) (1, 1, 1, 1)-(As, As, As, As) (Ad, Ad, Ad, Ad) (1, 1, 1, 1)-(Ad, Ad, Ad, Ad) (f, f, f, 1); f=min(as, 1-Ad) 9
Referências Angel, E. Interactive Computer Graphics A topdown approach with OpenGL. Addicon-Wesley, 1997. OpenGL Programming Guide 2nd. Ed. The Oficial Guide to Learning: OpenGL, version 1.1. Disponível em: http://www.dcc.unicamp.br/~lmarcos/courses/mc603/redbook/about.html 10