Escolar Documentos
Profissional Documentos
Cultura Documentos
ILUMINAÇÃO EM JOGOS 3D
UMA ABORDAGEM UTILIZANDO OPENGL
Londrina
2006
KLEBER LOPES DA SILVA
ILUMINAÇÃO EM AMBIENTES 3D
Londrina
2006
KLEBER LOPES DA SILVA
ILUMINAÇÃO EM AMBIENTES 3D
COMISSÃO EXAMINADORA
________________________________
Prof. Dr. Alan Salvany Felinto
____________________________________
Prof. Ms. Márcio Shimoda
____________________________________
Prof. Dra. Cinthyan Renata Sachs C. de Barbosa
With the increasing development of the gamming programming, the study of the
techniques about this area becomes indispensable to the developers of the future.
One of the studies of major importance in this branch is the illumination, that
contributes massively for the good appearance of a game. The area of graphical
computation and illumination in real time is vast, complex and interesting, therefore,
the studies contained here only serve as handspike for continuing in the study in this
area.
1. INTRODUÇÃO ..................................................................................................................11
2. ASPECTOS TEÓRICOS ...................................................................................................12
2.1. A Luz Segundo a Física..................................................................................12
2.1.1. Aspectos Físicos ......................................................................................12
2.1.2. Fenômenos relacionados à luz ................................................................13
2.1.3. Refração e Reflexão.................................................................................13
2.1.4. Sombra.....................................................................................................15
2.2. Cores ..............................................................................................................16
2.2.1. Aspectos Físicos ......................................................................................16
2.2.2. Percepção Humana das Cores ................................................................16
2.2.3. Sistemas de Cores ...................................................................................17
2.2.4. O Sistema de Cores CMYK......................................................................19
2.2.5. O Sistema de Cores RGB ........................................................................20
2.2.6. Os Sistemas de Cores HSV e HLS ..........................................................22
3. ASPECTOS COMPUTACIONAIS ..................................................................................24
3.1. A biblioteca gráfica OpenGL ...........................................................................24
3.1.1. Formação dos Comandos em OpenGL....................................................24
3.1.2. Máquina de Estados.................................................................................25
3.2. Luzes e Materiais............................................................................................26
3.3. Fontes de Luz .................................................................................................29
3.3.1. Fontes de Cores.......................................................................................30
3.3.2. Luz Ambiente ...........................................................................................30
3.3.3. Fontes Pontuais .......................................................................................31
3.3.4. Holofotes (Spotlights) ...............................................................................32
3.3.5. Fontes Distantes de Luz...........................................................................33
3.4. Modelo de Reflexão de Phong (Phong Reflection Model) ..............................34
3.4.1. Reflexão Ambiente ...................................................................................36
3.4.2. Reflexão Difusa ........................................................................................36
3.4.3. Reflexão Especular ..................................................................................38
3.4.4. O Modelo de Phong Modificado (Modelo Blinn-Phong)............................40
3.5. Sombreamento Poligonal (Polygonal Shading) ..............................................41
3.5.1. Sombreamento Plano (Flat Shading) .......................................................42
3.5.2. Sombreamento Suave/Gouraud (Smooth/Gouraud Shading) ..................43
3.5.3. Sombreamento de Phong (Phong Shading).............................................44
3.6. Sombras .........................................................................................................45
3.6.1. Sombras Projetadas (Projective Shadows) ..............................................45
3.6.2. Volumes de Sombras (Shadow Volumes)................................................47
3.7. Reflexos..........................................................................................................49
3.7.1. Reflexos Através do Método de Reflexão por Texturas ...........................51
3.7.2. Multi-texturas............................................................................................51
3.7.3. Environment Mapping ..............................................................................52
3.8. Reflexos Utilizando Objetos Virtuais ...............................................................53
4. CONCLUSÃO.....................................................................................................................58
10
BIBLIOGRAFIA ....................................................................................................................59
11
1. INTRODUÇÃO
2. ASPECTOS TEÓRICOS
Figura 2: Refração de um
raio de luz.
1
Há outros tipos de reflexão como a retro reflexão, porém fogem do escopo deste trabalho.
15
2.1.4. Sombra
2.2. CORES
Juntamente com a luz, as cores são o que dão vida a uma cena,
tanto que suas definições se confundem. As cores são formadas a partir da
decomposição da própria luz branca, dependendo do comprimento de onda da luz,
tem-se uma cor diferente.
As próximas seções discutem a formação da cor em objetos reais, a
maneira como os seres humanos a percebem e os sistemas de cores, com alguns
exemplos mais importantes.
Quando as cores que são refletidas por objetos e incidem nos olhos
do observador, células especializadas em sua captação de luz entram em ação.
Estas células são chamadas de células fotossensíveis e estão localizadas na retina
do olho humano.
17
aspectos relacionados à cor. Por isso são usados sistemas de cores diferentes para
propósitos diferentes. RGB, CMYK, HSV e HLS são alguns exemplos de sistemas de
cores mais usados que descrevem seus respectivos universos de cores de maneira
diferente entre si (TRAINA, 2006).
Os sistemas de cores são geralmente formados por duas ou três
cores primárias (algumas vezes com uma cor adicional), que são utilizadas para
formar o domínio de todas as cores que o sistema pode descrever, que é chamado
de color space (ou color gamut) (TRAINA, 2006). A mistura das máximas
intensidades de duas cores primárias forma o que é chamado de cor secundária.
A formação de uma cor num determinado sistema de cores se dá
pela combinação de uma ou mais cores primárias em quantidades específicas ou
variando sua coloração através do brilho, contraste, saturação, etc., formando assim
a cor em particular. A combinação de todas as combinações possíveis de misturas
de cores primárias do sistema forma o seu color space (COLOR ..., 2006).
Os sistemas de cores podem ser classificados em dois grupos: os
aditivos e os subtrativos. Nos aditivos, as cores primárias são consideradas como
sendo focos de luz colorida, cuja soma resulta na luz branca. Um exemplo é o
sistema de cores RGB (Figura 6). Já nos subtrativos, as cores são consideradas
pigmentos, que, se somadas, resultam na cor preta. O sistema de cores CMYK
(Figura 7) é subtrativo.
2
Apesar de a cor preta não ser uma cor primária, neste contexto ela será referenciada como uma.
3
Pequenos traços e prolongamentos presentes em algumas letras. Por exemplo: a letra “T” sem
serifa: “T” e a mesma letra com serifa: “T”.
20
4
CRT - Cathode Ray Tube (Tubo de Raios Catódicos): Tecnologia de fabricação de monitores mais
antiga, porém ainda muito utilizada. Consiste de um tubo de vidro com um canhão na parte traseira
que atira elétrons numa tela de fósforo localizada na parte fronteira do tubo onde as imagens são
exibidas [P2].
5
LCD - Liquid Crystal Display (Tela de Cristal Líquido): Tecnologia recente de fabricação de
monitores em que a imagem do dispositivo é projetada em um cristal líquido.
6
Plasma: Tecnologia recente de fabricação de monitores, em que a imagem é projetada num líquido
gelatinoso.
7
Pixel: unidade mínima de uma imagem em um monitor.
22
Além dos Sistemas RGB e CMYK que têm suas definições voltadas
para o uso técnico, existem outros sistemas que utilizam conceitos mais intuitivos
que a mistura de cores para sua definição de color space.
Os Sistemas HSV/HSB (Hue - Matiz, Saturation - Saturação,
Value/Brightness - Valor/Brilho) (HSV..., 2006) e HLS (Hue - Matiz, Lightness -
Luminosidade, Saturation - Saturação) (HLS..., 2006) são exemplos deste grupo de
Sistemas de cores. Como não utilizam combinações de cores, não podem ser
classificados nem como aditivos nem como subtrativos.
O Sistema HSV é formado pelas três componentes (HSV..., 2006):
• Hue (Matiz): é a cor (comprimento de onda) predominante (HUE..., 2006);
• Saturation (Saturação): também conhecida como pureza, é a vivacidade da cor.
Uma cor com muita saturação parece mais "viva", ou pura. Com pouca saturação, a
cor fica acinzentada (SATURATION..., 2006);
• Value/Brightness (Valor/Brilho): a luminosidade em uma cor, basicamente a
quantidade de branco e preto adicionados à cor.
Essas componentes e suas variações podem ser representadas em
um cone, onde sua base representa a variação da matiz, a distância da cor do
centro do cone é a saturação e a altura é o brilho, como mostra a Figura 11.
3. ASPECTOS COMPUTACIONAIS
Algo que se pode notar desde os primeiros comandos que são vistos
em OpenGL é uma padronização na nomenclatura dos comandos. Tal nomenclatura
não é somente utilizada pela OpenGL, mas seguida por suas extensões e
bibliotecas auxiliares como a GLU e a GLUT.
A formação dos comandos é feita da seguinte maneira: <prefixo gl>
<nome da função> <quantidade de parâmetros> <tipo> <vetor>, como mostrado a
seguir, onde temos a função glVertex, que desenha um vértice numa posição
especificada pelos seus parâmetros:
25
gl Vertex 3 f v
Onde o tipo dos parâmetros pode ser ‘f’ para o tipo float, ‘d’, para
double, ‘i’ para int ou ‘s’ para short. O sufixo ‘v’ indica que o parâmetro passado é um
vetor de variáveis do tipo e tamanho especificado no nome da função.
8
Bui Tuong Phong, em sua dissertação Illumination for Computer Generated Pictures (Iluminação
para Figuras Geradas por Computador) de 1973, descreve seu modelo de reflexão (Phong reflection
model) e de sombreamento (Phong shadding), modelos muito utilizados no campo da computação
gráfica.
28
Ir
I = Ig
Ib
Cada uma destas componentes representa a quantidade
independente de cada uma das cores que forma a luz em questão.
A luz ambiente pode ser descrita como sendo uma luz que incide
igualmente em todas as superfícies de uma cena e reflete de maneira homogênea
em todas as direções. Uma simulação deste tipo de iluminação poderia ser criada,
distribuindo fontes de luz por toda a cena e integrando a iluminação de cada fonte
com cada uma das superfícies da cena. Porém isso teria um custo computacional
muito grande, o que deixaria inviável esse tipo de iluminação para cenas
renderizadas em tempo real. Ao invés disso, podemos inserir uma luz que age
uniformemente sobre todos os pontos da cena. Representando a intensidade da luz
ambiente como Ia, podemos descrevê-la em OpenGL como sendo a matriz:
31
I ar
Ia = Iag
Iab
Para simplificação na denotação de funções matemáticas, usaremos
Ia para representar qualquer componente da matriz Ia.
Uma fonte pontual é uma fonte sem espessura, largura ou altura que
emite luz para todas as direções. Uma fonte pontual localizada na posição P0 é
caracterizada pela matriz:
I r (P0 )
I(P0 ) = Ig (P0 )
Ib(P0 )
A intensidade de iluminação recebida por uma fonte pontual é o
inverso do quadrado da distância entre o ponto luminoso e o ponto iluminado.
Portanto, num ponto arbitrário P de uma superfície, a intensidade de iluminação
pode ser calculada através da matriz formada por:
1 I(P0 )
i(P, P0 ) = 2
|P - P0 |
Como feito com a luz ambiente, usaremos I(P0) para representar
qualquer componente da matriz I(P0).
O uso de pontos de luz na maioria das aplicações é devido a sua
facilidade de uso e não por sua proximidade com a luz real. Cenas que possuem
apenas pontos de luz tender a ter um alto contraste, distinguindo-se bem áreas
claras de áreas escuras. Cenas reais possuem escalas de cores mais complexas.
Para amenizar esse problema, pode-se utilizar de luzes ambientes, diminuindo o
contraste.
Na prática, ao invés de se utilizar o inverso do quadrado da distância
dos pontos, para melhor aproximação com cenas reais, utiliza-se (a + bd + cd2)-1,
onde d é a distância entre os pontos luminoso e iluminado e as constantes a, b e c
podem ser escolhidos para suavizar a iluminação.
32
intensidade
−θ θ
φ
Figura 20: Atenuação de um holofote.
intensidade
−θ θ
φ
Figura 21: Expoente do holofote.
I = Ia + Id + Is
= La Ra + Ld Rd + Ls Rs
36
Como este cálculo será feito para todas as cores primárias e para
todas as fontes de luz, o termo ambiente pode ser adicionado no final.
Ia = ka La
Onde La pode ser a luminosidade de uma fonte de luz qualquer na
cena ou pode o ser o termo global de iluminação ambiente. Lembrando as
superfícies possuem os três coeficientes para a componente ambiente: kar, kag e kab.
Rd α cosθ
Onde α é o coeficiente de reflexão do material da superfície e θ é o
ângulo entre a normal n do ponto em questão e o vetor l da direção da fonte de luz.
Se n e l forem vetores normalizados, então o co-seno de θ pode ser expresso como
sendo o produto interno entre l e n:
cosθ = l . n
Adicionando o coeficiente de reflexão kd (coeficiente de reflexão
difusa), que representa a fração de raios a serem refletidos (dependente do
material), temos a componente de reflexão difusa:
Id = kd (l . n) Ld
Se ainda quisermos incorporar a distância d percorrida pelos raios
de luz até a superfície, teremos:
kd
Id = (l . n) Ld
a + bd + cd 2
38
Is = ks Ls cos αφ
O coeficiente ks (0 ≤ ks ≤ 1) é a fração da luz incidente que é refletida.
O expoente α representa o coeficiente de brilho. O gráfico da Figura 28 mostra o que
acontece com o alcance do brilho quando se incrementa α. No limite, α tende ao
infinito. Temos então um espelho. Com α entre 100 e 500 temos superfícies
metálicas e com α < 100, superfícies com um brilho amplo e pouco acentuado.
α=1
α=2
α=5
Figura 28: Efeito do coeficiente
de brilho.
Is = ks Ls max((r . v)α , 0)
Podemos mais uma vez incorporar a distância da fonte de luz da
superfície, resultando em:
Id =
1 (kd Ld max(l . n, 0) + ks Ls max((r . v)α , 0)) + ka La
a + bd + cd 2
Sendo esta fórmula computada para todas as fontes de luz e todas
as cores primárias.
Um artifício utilizado é associar valores diferentes para as
componentes de cada uma das fontes de luz para tornar a cena um pouco mais
próxima da real. Isso porque, como não conseguimos resolver a equação da
renderização (Seção 3.2) por completo, é necessário que se encontrem alternativas
que contornem este problema.
Considere, por exemplo, uma cena iluminada com muitos objetos.
Quando a luz incide diretamente sobre um objeto, ela é refletida e podemos modelar
esse fenômeno através das componentes difusa e especular da fonte. Entretanto,
40
grande parte da luz restante é refletida por outros objetos na cena, o que contribui
com a iluminação recebida pelo objeto em questão.
Podemos aproximar este termo tendo uma componente ambiente
associada à fonte. A quantidade de luz que será associada a este termo depende
tanto da cor da fonte quanto da cor dos objetos na cena. Porém, o problema está em
tentar calcular iluminação global através de renderizações locais.
por que o olho humano percebe a diferença de padrões que estavam sendo
mantidos e são mudados repentinamente, como mostra a Figura 32.
O que vemos são tiras que são chamadas de Mach bands (Mach em
referência às barreiras da velocidade do som), um efeito que desejamos que não
aconteça.
9
Henri Gouraud: cientista da computação francês, ph.D pela universidade de Utah em 1971.
44
n1 n2
n3
n4
3.6. SOMBRAS
feito é tratar cada polígono do objeto que receberá a sombra como sendo uma
superfície plana. Uma sombra no canto de uma parede ainda é viável, porém,
projetar uma sombra em um objeto muito mais completo torna este método
impraticável.
Outra limitação do método de sombras projetadas é o fato de a
sombra ser uma versão achatada do objeto original e não um objeto novo, o que
significa que suas normais também foram achatadas, portanto, impossibilita a
correta iluminação de uma sombra projetada.
Apesar destas limitações, este método ainda é bastante utilizado
para aplicações em que não é necessária a interação de sombras com outros
objetos. Para estas situações, um dos métodos favoritos dos programadores é o de
volumes de sombras.
glEnable(GL_CULL_FACE);
glFrontFace(GL_CCW);
Isso faz com que as faces traseiras não sejam desenhadas e indica que as faces
desenhadas no sentido anti-horário são as faces fronteiras 10 . Com isso, basta
incrementar o contador toda vez que for encontrada uma face no stencil buffer.
3. Neste passo, deve ser feito quase o mesmo que no passo anterior, mas agora as
faces que não serão desenhadas serão as faces exteriores. Em OpenGL:
glCullFace(GL_CW);
O que inverte o resultado do comando glCullFace anterior. Agora deve-se
decrementar o contador toda vez que uma face é encontrada no stencil buffer.
4. O último passo consiste em renderizar, com as luzes especular e difusa ligadas,
os pontos que possuem o contador do stencil buffer igual a zero.
Estes quatro passos para cada ponto da cena podem ser um tanto
pesados computacionalmente, porém, como dito há pouco, isto não está se tornando
mais um problema. Um outro problema que pode surgir é quando o observador está
dentro de um volume de sombra, o que vai causar uma inconsistência no valor do
contador. Há algoritmos que podem resolver esta questão, porém são complicados e
não estão no âmbito deste trabalho.
3.7. REFLEXOS
Reflexos são um dos efeitos que mais são notados em uma cena.
Se corretamente implementados, eles podem adicionar muito realismo, mesmo nas
mais simples cenas.
Tentar utilizar os modelos da física diretamente nos cálculos de
reflexos em cenas renderizadas pode ser muito caro computacionalmente. Quanto
mais fiel à física o modelo for, maior o processamento necessário. Os métodos aqui
descritos tentam englobar as mais importantes partes dos efeitos reais, juntamente
com uma eficiência aceitável.
Considere o reflexo como sendo a visão de um objeto virtual. Como
mostra a Figura 37, o reflexo de um objeto é formada atrás de sua superfície
refletora. Dois passos são necessários para implementar reflexos: usar os objetos da
10
Desenhar as faces dianteiras no sentido anti-horário é uma convenção utilizada em OpenGL.
50
cena para criar suas versões refletidas e desenhá-las cortadas pelo desenho do
objeto refletor.
3.7.2. Multi-texturas
desenharObjeto();
glDepthMask(GL_FALSE);
desenharChao();
glScalef(1.f, -1.f, 1.f);
posicionarLuz();
desenharObjeto();
Até o presente momento, assumimos que o plano em que estamos
configurando o reflexo é infinito, o que geralmente não acontece na prática. Se
executarmos este algoritmo em superfícies finitas, em determinadas posições será
possível ao observador ver reflexos em partes que não existem. Isso pode ocorrer,
por exemplo, em uma cena que consiste de espelho numa parede não reflexiva. Se
não cortamos a figura resultante do reflexo de acordo com as bordas do espelho, a
parede refletirá tanto quanto o espelho. Como visto na Seção 3.6, um artifício
bastante útil para este fim em OpenGL é a stencil buffer. Nosso algoritmo agora,
mais elaborado, fica assim:
// primeiro, desabilitamos as buffers de cores e
profundidade
// pois não é desejado que o plano apareça ainda na
cena
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE,
GL_FALSE);
glDepthMask(GL_FALSE);
4. CONCLUSÃO
BIBLIOGRAFIA