Material de Auxílio Didático
EA978 - Sistemas de informações gráficas
Primeiro semestre de 2003
3o Projeto
Atividade 1 - Cores
Objetivo: Modificar as propriedades dos materiais e das fontes de luz da cena do primeiro projeto de modo a incluir cores no ambiente e gerar imagens de cada componente de cor RGB separadamente. Além disso, realizar a conversão entre o modelo de cor RGB para o modelo HSV, YIQ e XYZ.
Cor e visualização das componentes RGB
A definição de cor no OpenGL é descrita segundo o modelo RGB. Para habilitar as cores na cena utilizada no primeiro projeto basta definir novas propriedades dos materiais. Já vimos anteriormente que os vetores que descrevem as cores de reflexão difusa, especular, ambiente, etc, são compostos por quatro valores na faixa [0,1], como em GLfloat diffuse[] = { 1.0, 0.5, 0.5, 0.5 }. O valor inicial é um valor de opacidade que deve ser mantido em 1.0 (a modificação desse valor só faz sentido no modelo RGBA, que não será utilizado nesse curso). As componentes restantes contém os valores do canais R, G e B. Por exemplo, o vetor GLfloat diffuse[] = { 1.0, 0.0, 1.0, 0.0 } descreve um material que reflete (ou emite) luz verde e apenas esta. Mais detalhes podem ser encontrados nas demonstrações didáticas dessa tarefa.
Modifique as propriedades dos materiais do primeiro projeto de modo que a cena fique colorida, como mostra a imagem abaixo:
Cena colorida (luz spot branca).
Também é possível modificar as cores das fontes de luz para observar a interação de uma cor emitida com uma cor refletida por uma superfície. Por exemplo, a cena abaixo foi renderizada com a luz da luminária na cor ciano. Observe o que ocorre no tampo da mesa.
Cena colorida (luz spot ciano).
A segunda parte da tarefa consiste em mostrar cada componente de cor (R, G e
B) individualmente.
Para isso utilize o seguinte esqueleto de código: crgb.c
Ao executar o programa serão mostradas quatro janelas, uma contendo a imagem colorida e outras três mostrando em tons de cinza cada componente de cor R, G e B, como mostram as imagens abaixo (executadas sobre a cena colorida com luz spot ciano):
Componente Red.
Observe como o brilho da luz spot não aparece no chão e no tampo da mesa, pois
essas superfícies não refletem vermelho.
Componente Green.
Componente Blue.
Use o seguinte esqueleto de código para implementar essa tarefa: chsv.c
Modifique as funções initMainWnd(), displayMainWnd() e reshapeMainWnd() do código acima de acordo com o código gerado para a exibição da cena colorida da tarefa anterior. A função de conversão RGB para HSV deve ser implementada no escopo de RGBtoHSV(). Essa função tem como entrada as variáveis r, g e b (na faixa de 0 a 1) e deve retornar os valores convertidos nos ponteiros h, s e v, também na faixa entre 0 e 1.
Ao executar o programa serão mostradas quatro janelas, uma contendo a imagem colorida e outras três mostrando em tons de cinza cada componente de cor H, S e V, como mostram as imagens abaixo (executadas sobre a cena colorida com luz spot ciano):
Componente Hue. Para fins de visualização, cada valor foi fixado na faixa [0,1).
Entretanto, o valor Hue é normalmente descrito em graus [0-360).
Componente Saturation.
Componente Value.
Use o seguinte esqueleto de código para implementar essa tarefa: cyiq.c
Modifique as funções initMainWnd(), displayMainWnd() e reshapeMainWnd() do código acima de acordo com o código gerado para a exibição da cena colorida da primeira tarefa. A função de conversão RGB para YIQ deve ser implementada no escopo de RGBtoYIQ(). Essa função tem como entrada as variáveis r, g e b (na faixa de 0 a 1) e deve retornar os valores convertidos nos ponteiros y, i e q, também na faixa entre 0 e 1.
Ao executar o programa serão mostradas quatro janelas, uma contendo a imagem colorida e outras três mostrando em tons de cinza cada componente de cor Y, I e Q, como mostram as imagens abaixo (executadas sobre a cena colorida com luz spot ciano):
Componente Y.
Componente I.
Componente Q.
Use o seguinte esqueleto de código para implementar essa tarefa: cxyz.c
Modifique as funções initMainWnd(), displayMainWnd() e reshapeMainWnd() do código acima de acordo com o código gerado para a exibição da cena colorida da primeira tarefa. A função de conversão RGB para XYZ deve ser implementada no escopo de RGBtoXYZ(). Essa função tem como entrada as variáveis r, g e b (na faixa de 0 a 1) e deve retornar os valores convertidos nos ponteiros x, y e z, também na faixa entre 0 e 1.
Ao executar o programa serão mostradas quatro janelas, uma contendo a imagem colorida e outras três mostrando em tons de cinza cada componente de cor X, Y e Z, como mostram as imagens abaixo (executadas sobre a cena colorida com luz spot ciano):
Componente X.
Componente Y.
Componente Z.
As demonstrações didáticas abaixo relacionadas auxiliam na
compreensão dos conceitos básicos de OpenGL necessários para a implementação
dessa atividade. Para compilar esses programas nas
máquinas do laboratório LE-20, use o seguinte arquivo makefile.
Adicione esse arquivo no mesmo diretório onde estão os programas com extensão
.c de cada demonstração. Para compilar todas as demonstrações, digite "make
all" na linha de comando. Para compilar uma demonstração em
particular, execute o comando "make"
com o parâmetro indicado em cada descrição do programa.
![]() |
Interpolação de cores
[smooth.c] Mostra um triângulo renderizado com a tonalização de Gouraud. Cada vértice do triângulo é designado com uma cor primária e a interpolação entre as cores no interior do triângulo é mostrada. Para gerar o executável digite make smooth. Referência: Capítulo 5 do OpenGL Programming Guide (Listagem 5.1). |
![]() |
Propriedade de reflexão difusa [colormat.c] Demonstração de uma esfera iluminada por uma fonte de luz e cujas propriedades do material podem ser alteradas através do mouse. Os botões esquerdo, do meio e direito do mouse modificam, respectivamente, as componentes R, G e B das propriedades de reflexão de luz difusa do objeto. Essa demonstração faz uso da função glColorMaterial para mudar as propriedades do material apenas com chamadas de glColor*. Para gerar o executável digite make colormat. Referência: Capítulo 6 do OpenGL Programming Guide (Listagem 6.4). |
![]() |
Materiais [material.c] Demonstração do modelo de iluminação do OpenGL sobre 12 esferas com diferentes propriedades dos materiais. Apenas uma fonte de luz é utilizada. Para gerar o executável digite make material. Referência: Capítulo 6 do OpenGL Programming Guide (Listagem 6.3). Sugestão: Altere os parâmetros de iluminação ambiente, reflexão difusa, reflexão especular, expoente de brilho e componente emissiva. |
![]() |
[Tutorial OpenGL -
Materiais] Executável Windows Demonstra como a iluminação e a propriedade de um material em OpenGL interagem entre si. As propriedades do material são configuráveis. Há também controles para ajustar os parâmetros da fonte de luz, incluindo seu fator de atenuação. |
Autor: Harlen Costa Batagelo (harlen@dca.fee.unicamp.br)