|
Utilização de Luzes em OpenGL |
A biblioteca gráfica OpenGL é capaz de trabalhar com 3
tipos de LUZ: Ambiente, Difusa e Especular.
Exemplo em C
Luz Ambiente
Para inserir iluminação em uma cena em OPENGL, são
necessárias duas providências:
-
geração de uma Normal para cada face:
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;
ativação da iluminação através
da chamada da função
glEnable(GL_LIGHTING);
Isto irá gerar objetos em tons de cinza.
-
definição da cor da luz ambiente
const
// Define a cor da luz ambiente
LuzAmbient : Array[0..3]
of Glfloat = (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.
-
Ativar o uso da luz ambiente
glLightModelfv(GL_LIGHT_MODEL_AMBIENT,
@LuzAmbient);
// o primeiro parâmetro
define o modelo de iluminação e o segundo os parâmetros
// deste modelo através
de um vetor
Observação
Para definir a cor de uma face deve-se utilizar a técnica de
"color tracking". Com ela pode-se definir a cor de uma face
chamando a função glColor(r,g,b)
antes da definição da face. A ativação
da "color tracking" é feita pela chamada
glEnable(GL_COLOR_MATERIAL);
Exemplo Completo de Luz Difusa:
// As funções
"DefineLuz", "DesenhaCubo" devem ser chamadas a partir da rotina do evento
Paint o objeto de OpenGL.
Luz Difusa
Uma luz do tipo Difusa tem como características básicas:
-
responsável pelo efeito de "degradé" nos objetos;
-
há um ponto a partir do qual a luz é emitida;
-
seu brilho é emitido indistintamente em todas as direções.
Por isto, em OpenGL, quando se trabalha com luzes difusas, deve-se determinar:
-
a componente ambinte da luz(opcional) ;
-
a cor da luz difusa(r,g,b);
-
a posição da luz(x,y,z).
Os passsos para tanto são os seguintes:
-
definir cor da luz Ambiente, a posição e a cor da
Luz Difusa, através de constantes
const
LuzAmbiente : Array[0..3] of
GLfloat = (0.5, 0.5, 0.5, 1.0);
// Cor da Luz Difusa
LuzDifusa : Array[0..3] of GLfloat
= (0.8, 0.8, 0.8, 1.0);
// Posição da
Luz Difusa
PosicaoLuz : Array[0..3] of
GLfloat = (30.0, 30.0, 0.0, 1.0);
-
Ativar o uso da luz ambiente e o "Color Tracking"(conforme
exemplo anterior)
// Habilita o uso de iluminação
glEnable(GL_LIGHTING);
// Ativa o uso da luz ambiente
glLightModelfv(GL_LIGHT_MODEL_AMBIENT,
@LuzAmbient);
// Ativa o "Color Tracking"
glEnable(GL_COLOR_MATERIAL);
-
Definir e ativar uma luz Difusa
Em OpenGl podemos ter até 8 pontos de Luz. Cada um
deles designado por uma constante(GL_LIGHT0, GL_LIGHT1, GL_LIGHT2,
...). NoExemplo a seguir definimos as características da luz
de número 0(zero).
// Define os parâmetros da Luz número Zero
glLightfv(GL_LIGHT0, GL_AMBIENT, @LuzAmbiente);
glLightfv(GL_LIGHT0, GL_DIFFUSE, @LuzDifusa );
glLightfv(GL_LIGHT0, GL_POSITION,@PosicaoLuz );
glEnable(GL_LIGHT0);
// Exibe uma linha da posição da luz até (0,0,0)
glBegin(GL_LINES);
glVertex4fv(@PosicaoLuz);
glVertex3f(0,0,0);
A partir deste ponto pode-se desenhar quaisquer objetos.
Luz Especular
Uma luz do tipo Especular tem como características básicas:
-
é a responsável pela geração de pontos de
brilho no objeto;
-
o brilho é da cor da luz;
-
há um ponto a partir do qual ela é emitida;
-
seu brilho é emitido indistintamente em todas as direções;
-
cada tipo de material(objeto) tem um grau de especularidade(que em outras
palavras define a capacidade de brilho do material).
Por isto, em OpenGL, quando se trabalha com luzes difusas, deve-se determinar:
-
a componente ambinte da luz(opcional) ;
-
a posição da luz(x,y,z).
-
a cor da luz difusa(r,g,b);
-
a cor da luz especular(r,g,b);
-
a cor especular do objeto(r,g,b);
-
o capacidade de brilho do objeto, ou o grau de concentração
do brilho(algo como o grau de polimento do objeto);
Os passsos para tanto são os seguintes:
-
definir cor da luz Ambiente, a posição e a cor da Luz
Difusa e da Luz especular, através de constantes
const
LuzAmbiente : Array[0..3] of
GLfloat = (0.5, 0.5, 0.5, 1.0);
LuzDifusa : Array[0..3] of GLfloat
= (0.4, 0.4, 0.4, 1.0);
LuzEspecular: Array[0..3] of
GLfloat = (1.0, 0.0, 1.0, 1.0);
PosicaoLuz : Array[0..3] of
GLfloat = (0.0, 20.0, 60.0, 1.0);
Especularidade: Array[0..3]
of GLfloat = (0.0, 0.0, 0.0, 1.0);
-
Ativar o uso da luz ambiente e o "Color Tracking"(conforme
exemplo anterior)
// Habilita o uso de iluminação
glEnable(GL_LIGHTING);
// Ativa o uso da luz ambiente
glLightModelfv(GL_LIGHT_MODEL_AMBIENT,
@LuzAmbient);
// Ativa o "Color Tracking"
glEnable(GL_COLOR_MATERIAL);
-
Definir e ativar uma luz Especular
// Define os parâmetros da Luz número Zero
glLightfv(GL_LIGHT0, GL_AMBIENT, @LuzAmbiente);
glLightfv(GL_LIGHT0, GL_DIFFUSE, @LuzDifusa );
glLightfv(GL_LIGHT0, GL_SPECULAR, @LuzEspecular );
glLightfv(GL_LIGHT0, GL_POSITION, @PosicaoLuz );
glEnable(GL_LIGHT0);
-
Definir a cor especular do obejto
// Define a reflectancia do material
glMaterialfv(GL_FRONT,GL_SPECULAR, @Especularidade);
-
Definir o grau de especularidade do objeto
// Define a concentração do brilho.
// Quanto maior o valor do Segundo parametro, mais concentrado
será o brilho.
// (Valores válidos: de 0 a 128)
glMateriali(GL_FRONT,GL_SHININESS,20);
A partir deste ponto pode-se desenhar quaisquer objetos.