Conheça a iniciativa da Biblioteca dos Desenvolvedores
Índice da Biblioteca
Área dos Usuários
Fórum de Discussão
44 - Materiais e Cores
No capítulo anterior aprendemos como adicionar luzes ao nosso ambiente.
Você deve ter percebido que, quando alteramos algumas propriedades da OpenGL acontece algumas mudanças na forma de renderizar a cena.
Por exemplo, quando aplicamos a cor Amarela a um objeto, este objeto passa a ser impresso na tela com a cor amarela.
Mais quando incluimos uma textura ou uma luz no ambiente, o objeto amarelo sofre interferência dessas funções e acaba tendo sua cor original trocada.
Neste capitulo iremos aprofundar ainda mais nossos conhecimentos sobre os Materiais de Cores da OpenGL.
Primeiro, nós sabemos que a OpenGL trabalha com o padrão RGBA que faz a mistura de Cores e habilita a transparência.
VOCÊ PRECISA
SABER...
Alpha Channel é conhecido como Canal de Transparência.
Sempre que falarmos em opacidade, estamos falando em transparência. Tornar um objeto NÃO opaco é torna-lo transparente.
Quanto maior a opacidade do Objeto, menor é a transparência dele.
Basicamente, aprendemos 2 formas de adicionar cor aos nossos objetos.
- A primeira é aplicando cor diretamente sobre objeto.
- A segunda é aplicando cor sobre a superfície do objeto, alterando assim as propriedades da superfície ( conhecido como Material ) através de configurações ou através da incidência de luz.
Um dos problemas que nós iremos encontrar é com relação de cores e luzes.
Por exemplo, se um objeto vermelho for luminado por uma luz azul, esse objeto irá aparecer relativamente preto.
Isso acontece por que o objeto vermelho reflete luz vermelha e não azul e a luz contem luz azul e não vermelho.
Vamos aprender como aplicar uma cor transparente
Os comandos responsáveis por habilitar a transparência são:
Esta função especifíca quanto de RGBA será utilizado para o resultado de transparência.
sfactor especifíca qual o metodo usado para escalar ( aumentar ou diminuir ) os recursos de cores.
dfactor especifíca qual o metodo usado para escalar as cores de destino, tornando-as trasnparentes.
Existem vários parâmetros que podem ser utilizados nesta função.
A indicada pela OpenGl são
GL_SRC_ALPHA e GL_ONE_MINUS_SRC_ALPHA.
Leia no site oficial para poder usar outros parâmetros.
gluBuild2DMipmaps( GL_TEXTURE_2D, // A textura é 2D
3, // 3 Significa que é uma textura "RGB"
imagemTextura->sizeX, // Largura do Bitmap
imagemTextura->sizeY, // Altura do Bitmap
GL_RGB, // O Bitmap está no formato RGB
GL_UNSIGNED_BYTE, // Tipo de dado de cada Pixel é armazenado
imagemTextura->data); // Dados do Bitmap Atual
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
} FIM DE CÓDIGO...
Usando glColor4f ( 1.0f, 1.0f, 1.0f, 0.7f ); nós obtemos uma textura com as cores originais, adicionando apenas trasnparência para ela...
Eu usei uma textura com as cores vermelho, verde e azul para exemplo.
Veja o resultado do programa.
DICA...
Se você leu o código, deve ter percebido a diferença no quadrado que recebe a textura.
Sempre que você utilizar cores e texturas, é importante habilitar e desabilitar as opções, por que se não a OpenGL acaba misturando as cores e a renderização não vai funcionar como deveria.
Por isso, faça bom uso das funções:
glPushMatrix();
glEnable(GL_TEXTURE_2D);
glDisable(GL_TEXTURE_2D);
glPopMatrix();
Bom, o que aconteceria se pegarmos o primeiro exemplo, aonde aplicamos cores e transparência
e aplicarmos iluminação nela ?
No exemplo acima aplicamos uma luz ambiente e uma luz difusa.
Quando executamos o programa temos o horrível resultado:
Nosso render perdeu as cores e a transparência.
Isso acontece por que a luz interfere diretamente nas faces dos objetos.
Para mostrar as cores originais dos objetos, iremos precisar usar 2 funções importantes.
A glMaterial que já vimos e a glNormal.
Toda alteração de cor, transparência ou aplicação de textura é feita sobre as faces em OpenGL.
E quando aplicamos esses valores a essas faces na verdade estamos criando um material e aplicando a face.
Iremos usar a função glNormal por que ela vai indicar para a OpenGL qual é a face que está visível e que precisa ser iluminada.
Iremos usar a função glMaterial para criar um material para cada objeto, fazendo com que a luz não altere sua cor original.
Agora sim, temos o exemplo de Luzes, Transparências e cores.
Inclusive, se você mudar a posição da luz, para perto, as cores originais vão ficar mais escuras.
Pronto.. agora temos um sistema de luzes com cores eficiente.
Se você usar o exemplo acima com texturas, você também não terá problemas.
Brightness = Luminance = Luminosidade
O Termo usado ai em cima representa o quanto uma luz vai iluminar um objeto mudando sua cor original.
Não confunda Brightness com Blend, blending é o canal de transparência.
CÓDIGO...
// Exemplo de Luz com textura, normal, Material e Brightness // Autor: Adriano Waltrick // BDJogos // Data: 13/03/2008
#include <allegro.h>
#include <alleggl.h>
gluBuild2DMipmaps( GL_TEXTURE_2D, // A textura é 2D
3, // 3 Significa que é uma textura "RGB"
imagemTextura->sizeX, // Largura do Bitmap
imagemTextura->sizeY, // Altura do Bitmap
GL_RGB, // O Bitmap está no formato RGB
GL_UNSIGNED_BYTE, // Tipo de dado de cada Pixel é armazenado
imagemTextura->data); // Dados do Bitmap Atual
Observe que no exemplo acima aplicamos iluminação direcionada amarelada no triangulo vermelho, adicionando brilho amarelo.
As outras cores não foram influenciadas, o que é muito importante.
01/06/2007 (C) Copyright. Todos os Direitos Reservados. Leia a política de privacidade do portal.
É proibida a cópia de conteúdo deste site de acordo com
a Lei Brasileira de Direitos Autorais.