Utilização de Luzes em OpenGL
A biblioteca gráfica OpenGl é capaz de trabalhar com 3 tipos de LUZ: Ambite, Difusa e Especular.
Luz Ambiente
Para inserir iluminação em uma cena em OPENGL, são necessárias duas providências:
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;
glEnable(GL_LIGHTING);
Isto irá gerar objetos em tons de cinza.
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.
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.
procedure DefineLuz;
const
// Define a cor da luz ambiente.
LuzAmbient : Array[0..3] of GLfloat
= (1.0, 1.0, 1.0, 1.0);
begin
// 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);
end;
procedure DesenhaCubo;
begin
glColor3f(0,0,0.5); // Define a cor Azul
glBegin(GL_POLYGON); // face 1
glNormal3f(0,0,1);
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;
glColor3f(0.5,0.5,0); // Define a cor amarela
glBegin(GL_POLYGON); // face 2
glNormal3f(0,0,-1);
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;
end;
Luz Difusa
Uma luz do tipo Difusa tem como características básicas:
Por isto, em OpenGL, quando se trabalha com luzes difusas, deve-se determinar:
Os passsos para tanto são os seguintes:
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);
// 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);
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:
Por isto, em OpenGL, quando se trabalha com luzes difusas, deve-se determinar:
Os passsos para tanto são os seguintes:
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);
// 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);
// 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);
// Define a reflectancia do material
glMaterialfv(GL_FRONT,GL_SPECULAR, @Especularidade);
// 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.