Introducció

En aquest tema, explorarem com OpenGL maneja la il·luminació i els materials per crear escenes més realistes. La il·luminació és un aspecte crucial en la renderització gràfica, ja que afecta com es perceben els objectes en una escena. Aprendrem sobre diferents tipus de llums, com configurar-les i com definir les propietats dels materials per interactuar amb aquestes llums.

Conceptes Clau

  1. Tipus de Llums:

    • Llum Ambiental: Proporciona una il·luminació uniforme a tota l'escena.
    • Llum Difusa: Simula la llum que es dispersa en totes direccions després de colpejar una superfície.
    • Llum Especular: Simula els reflexos brillants que es veuen en superfícies llises.
  2. Propietats dels Materials:

    • Ambiental: Com el material reacciona a la llum ambiental.
    • Difusa: Com el material reacciona a la llum difusa.
    • Especular: Com el material reacciona a la llum especular.
    • Brillantor: Determina la intensitat del reflex especular.

Configuració de la Il·luminació

Tipus de Llums

Llum Ambiental

La llum ambiental és la més senzilla de configurar. Proporciona una il·luminació bàsica que afecta tots els objectes de l'escena de manera uniforme.

// Configuració de la llum ambiental
GLfloat ambientLight[] = { 0.2f, 0.2f, 0.2f, 1.0f };
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambientLight);

Llum Difusa

La llum difusa depèn de la direcció de la llum i de la normal de la superfície. Això crea un efecte més realista, ja que les superfícies perpendiculars a la llum es veuen més il·luminades.

// Configuració de la llum difusa
GLfloat diffuseLight[] = { 0.8f, 0.8f, 0.8f, 1.0f };
GLfloat lightPosition[] = { 1.0f, 1.0f, 1.0f, 0.0f };
glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight);
glLightfv(GL_LIGHT0, GL_POSITION, lightPosition);
glEnable(GL_LIGHT0);

Llum Especular

La llum especular crea reflexos brillants en superfícies llises. La seva intensitat i distribució depenen de l'angle entre la direcció de la llum, la normal de la superfície i la direcció de l'observador.

// Configuració de la llum especular
GLfloat specularLight[] = { 1.0f, 1.0f, 1.0f, 1.0f };
glLightfv(GL_LIGHT0, GL_SPECULAR, specularLight);

Propietats dels Materials

Perquè els objectes reaccionin correctament a la il·luminació, hem de definir les seves propietats materials.

// Propietats materials
GLfloat matAmbient[] = { 0.2f, 0.2f, 0.2f, 1.0f };
GLfloat matDiffuse[] = { 0.8f, 0.8f, 0.8f, 1.0f };
GLfloat matSpecular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
GLfloat matShininess[] = { 50.0f };

glMaterialfv(GL_FRONT, GL_AMBIENT, matAmbient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, matDiffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, matSpecular);
glMaterialfv(GL_FRONT, GL_SHININESS, matShininess);

Exemple Pràctic

A continuació, es mostra un exemple complet que combina la configuració de la il·luminació i les propietats materials per renderitzar un objecte amb efectes de llum realistes.

#include <GL/glut.h>

void initLighting() {
    // Configuració de la llum ambiental
    GLfloat ambientLight[] = { 0.2f, 0.2f, 0.2f, 1.0f };
    glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambientLight);

    // Configuració de la llum difusa
    GLfloat diffuseLight[] = { 0.8f, 0.8f, 0.8f, 1.0f };
    GLfloat lightPosition[] = { 1.0f, 1.0f, 1.0f, 0.0f };
    glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight);
    glLightfv(GL_LIGHT0, GL_POSITION, lightPosition);

    // Configuració de la llum especular
    GLfloat specularLight[] = { 1.0f, 1.0f, 1.0f, 1.0f };
    glLightfv(GL_LIGHT0, GL_SPECULAR, specularLight);

    glEnable(GL_LIGHT0);
    glEnable(GL_LIGHTING);
}

void initMaterial() {
    // Propietats materials
    GLfloat matAmbient[] = { 0.2f, 0.2f, 0.2f, 1.0f };
    GLfloat matDiffuse[] = { 0.8f, 0.8f, 0.8f, 1.0f };
    GLfloat matSpecular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
    GLfloat matShininess[] = { 50.0f };

    glMaterialfv(GL_FRONT, GL_AMBIENT, matAmbient);
    glMaterialfv(GL_FRONT, GL_DIFFUSE, matDiffuse);
    glMaterialfv(GL_FRONT, GL_SPECULAR, matSpecular);
    glMaterialfv(GL_FRONT, GL_SHININESS, matShininess);
}

void display() {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();

    // Configuració de la càmera
    gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);

    // Renderització d'un objecte
    glutSolidTeapot(1.0);

    glutSwapBuffers();
}

int main(int argc, char** argv) {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
    glutInitWindowSize(800, 600);
    glutCreateWindow("Il·luminació i Materials en OpenGL");

    glEnable(GL_DEPTH_TEST);

    initLighting();
    initMaterial();

    glutDisplayFunc(display);
    glutMainLoop();
    return 0;
}

Exercicis Pràctics

  1. Afegir una Segona Font de Llum:

    • Afegeix una segona font de llum a l'escena amb una posició i color diferents.
    • Experimenta amb diferents configuracions de llum difusa i especular.
  2. Modificar les Propietats Materials:

    • Canvia les propietats materials de l'objecte per veure com afecta la seva aparença.
    • Prova diferents valors de brillantor per veure com canvia el reflex especular.
  3. Crear una Escena amb Múltiples Objectes:

    • Crea una escena amb múltiples objectes, cadascun amb diferents propietats materials.
    • Configura la il·luminació de manera que cada objecte es vegi diferent segons la seva posició i material.

Resum

En aquest tema, hem après sobre els diferents tipus de llums en OpenGL i com configurar-los. També hem vist com definir les propietats materials dels objectes per interactuar amb la il·luminació. Aquests conceptes són fonamentals per crear escenes realistes i atractives visualment. En el proper tema, explorarem tècniques més avançades de renderització per millorar encara més la qualitat visual de les nostres escenes.

© Copyright 2024. Tots els drets reservats