Computação Gráfica Iluminação e Texturas António Ramires Fernandes + Luís Paulo Santos - Computação Gráfica 08/09 Iluminação • Para que o OpenGL ilumine a cena é necessário: – Na fase de setup: 1. Indicar o modelo de shading: FLAT ou SMOOTH 2. Indicar as características das fontes de luz 3. Activar a iluminação – Na fase de rendering: 1. Especificar os materiais dos objectos 2. Indicar as normais dos modelos DI-UM Computação Gráfica 07/08 2 Modelo de Shading • glShadeModel (opção) • Opção = GL_FLAT ou GL_SMOOTH DI-UM Computação Gráfica 07/08 3 Fonte de Luz • Uma fonte de luz direccional é especificada indicando o vector direcção: float l_dir={0., 1., 0., 0.}; // w=0. -> vector glLightfv (GL_LIGHT0, GL_POSITION, l_dir); • A intensidade difusa é especificada: float l_diff={1., 1., 1.}; glLightfv (GL_LIGHT0, GL_DIFFUSE, l_dir); • A luz ambiente presente na cena: float amb={0.2, 0.2, 0.2}; glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambient); DI-UM Computação Gráfica 07/08 4 Activar iluminação • glEnable (GL_LIGHT0); • glEnalble (GL_LIGHTING); DI-UM Computação Gráfica 07/08 5 Especificar os materiais • Antes de desenhar cada objecto indicar ao OpenGL que se devem usar as propriedades dos materiais dos objectos. – Para a componente de reflexão difusa: glColorMaterial(GL_FRONT, GL_DIFFUSE); – Usar a cor do objecto: glEnable(GL_COLOR_MATERIAL); DI-UM Computação Gráfica 07/08 6 Normais • Ao especificar cada vértice especifica-se a normal: glNormal3f (Nx, Ny, Nz); glVertex3f (Vx, Vy, Vz); • No caso do terreno a função terrainLoadFromImage (char *fname, int normals) calcula as normais para cada vértice se normals!=0 • A função terrainCreateDL() encarrega-se de especificar as normais se estas tiverem sido previamente calculadas DI-UM Computação Gráfica 07/08 7 Exercício • Adapte a aplicação desenvolvida nas sessões anteriores para que: – Use uma fonte de luz direccional – Permita aumentar/diminuir a componente ambiente pressionando as teclas ‘A’/’a’ DI-UM Computação Gráfica 07/08 8 Transformações das texturas As texturas podem ser transformadas tal como a geometria. Para especificar transformações a aplicar a texturas usar: glMatrixMode(GL_TEXTURE); As transformações especificadas a seguir aplicar-se-ão às texturas. DI-UM Computação Gráfica 07/08 9 Transformações das texturas • Por exemplo, para rodar uma textura mapeada num polígono de um ângulo dependente da frame actual (contada usando a variável step) usar: glMatrixMode(GL_TEXTURE); glPushMatrix(); glRotatef(step/100.,0.,0.,1.); glMatrixMode(GL_MODELVIEW); • Após o desenho do polígono fazer o reset à matriz: glMatrixMode(GL_TEXTURE); glPopMatrix(); glMatrixMode(GL_MODELVIEW); DI-UM Computação Gráfica 07/08 10 Exercício • Adapte a aplicação desenvolvida nas sessões anteriores para que: – Desenhe um polígono horizontal (plano XZ) com uma textura representando água mapeada (ficheiro water.tga) – A coordenada YY deste polígono varie entre 0 e 100 usando as teclas ‘w’/‘W’ – Esta textura sofra uma rotação de frame para frame simulando água DI-UM Computação Gráfica 07/08 11