Introducció

En aquest tema, explorarem els conceptes fonamentals d'il·luminació i ombrejat en gràfics 3D. La il·luminació és essencial per donar realisme a les escenes 3D, mentre que l'ombrejat determina com la llum interacciona amb les superfícies dels objectes. Aprendrem sobre diferents models d'il·luminació, tipus de fonts de llum i tècniques d'ombrejat.

Conceptes Clau

Models d'Il·luminació

  1. Il·luminació Ambiental:

    • Proporciona una llum uniforme a tota l'escena.
    • No té direcció específica.
    • Simula la llum dispersa en l'ambient.
  2. Il·luminació Difusa:

    • Depèn de l'angle entre la llum i la superfície.
    • Produeix un efecte suau i realista.
    • Utilitza la llei de Lambert.
  3. Il·luminació Especular:

    • Crea reflexos brillants.
    • Depèn de l'angle de visió i l'angle de la llum.
    • Utilitza el model de Phong.

Tipus de Fonts de Llum

  1. Llum Puntual:

    • Emana des d'un punt específic en totes direccions.
    • Exemples: bombeta, focus.
  2. Llum Direccional:

    • Té una direcció específica però no un punt d'origen definit.
    • Exemples: llum solar.
  3. Llum de Punt:

    • Emana des d'un punt i es dispersa en un angle concret.
    • Exemples: llum de focus.

Tècniques d'Ombrejat

  1. Ombrejat de Gouraud:

    • Calcula la il·luminació als vèrtexs i després interpola els colors a través de la superfície.
    • Més ràpid però menys precís.
  2. Ombrejat de Phong:

    • Interpola les normals dels vèrtexs i calcula la il·luminació per cada píxel.
    • Més precís però més costós computacionalment.
  3. Ombrejat de Blinn-Phong:

    • Variant del model de Phong.
    • Utilitza una aproximació diferent per calcular la il·luminació especular.

Exemples Pràctics

Exemple 1: Il·luminació Difusa

# Exemple de codi en Python utilitzant PyOpenGL per il·luminació difusa

from OpenGL.GL import *
from OpenGL.GLUT import *
from OpenGL.GLU import *

def init():
    glEnable(GL_DEPTH_TEST)
    glEnable(GL_LIGHTING)
    glEnable(GL_LIGHT0)
    
    # Configuració de la llum difusa
    light_diffuse = [1.0, 1.0, 1.0, 1.0]
    light_position = [1.0, 1.0, 1.0, 0.0]
    
    glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse)
    glLightfv(GL_LIGHT0, GL_POSITION, light_position)

def display():
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    glutSolidTeapot(1.0)
    glFlush()

glutInit()
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH)
glutInitWindowSize(500, 500)
glutCreateWindow(b'Il·luminació Difusa')
init()
glutDisplayFunc(display)
glutMainLoop()

Exemple 2: Ombrejat de Phong

# Exemple de codi en Python utilitzant PyOpenGL per ombrejat de Phong

from OpenGL.GL import *
from OpenGL.GLUT import *
from OpenGL.GLU import *

def init():
    glEnable(GL_DEPTH_TEST)
    glEnable(GL_LIGHTING)
    glEnable(GL_LIGHT0)
    
    # Configuració de la llum
    light_diffuse = [1.0, 1.0, 1.0, 1.0]
    light_position = [1.0, 1.0, 1.0, 0.0]
    
    glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse)
    glLightfv(GL_LIGHT0, GL_POSITION, light_position)
    
    # Configuració de l'ombrejat de Phong
    glShadeModel(GL_SMOOTH)

def display():
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    glutSolidTeapot(1.0)
    glFlush()

glutInit()
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH)
glutInitWindowSize(500, 500)
glutCreateWindow(b'Ombrejat de Phong')
init()
glutDisplayFunc(display)
glutMainLoop()

Exercicis Pràctics

Exercici 1: Implementar Il·luminació Especular

Objectiu: Afegir il·luminació especular a l'exemple d'il·luminació difusa.

Instruccions:

  1. Modifica el codi de l'exemple d'il·luminació difusa.
  2. Afegeix una configuració per a la llum especular.
  3. Afegeix una configuració per al material especular de l'objecte.

Solució:

def init():
    glEnable(GL_DEPTH_TEST)
    glEnable(GL_LIGHTING)
    glEnable(GL_LIGHT0)
    
    # Configuració de la llum difusa
    light_diffuse = [1.0, 1.0, 1.0, 1.0]
    light_position = [1.0, 1.0, 1.0, 0.0]
    
    glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse)
    glLightfv(GL_LIGHT0, GL_POSITION, light_position)
    
    # Configuració de la llum especular
    light_specular = [1.0, 1.0, 1.0, 1.0]
    glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular)
    
    # Configuració del material especular
    material_specular = [1.0, 1.0, 1.0, 1.0]
    material_shininess = [50.0]
    
    glMaterialfv(GL_FRONT, GL_SPECULAR, material_specular)
    glMaterialfv(GL_FRONT, GL_SHININESS, material_shininess)

glutInit()
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH)
glutInitWindowSize(500, 500)
glutCreateWindow(b'Il·luminació Especular')
init()
glutDisplayFunc(display)
glutMainLoop()

Errors Comuns i Consells

  1. Oblidar activar GL_LIGHTING:

    • Assegura't d'activar glEnable(GL_LIGHTING) per permetre la il·luminació.
  2. Configuració incorrecta de les normals:

    • Les normals han d'estar correctament definides per a cada vèrtex per obtenir resultats d'il·luminació precisos.
  3. No configurar el material:

    • Configura adequadament les propietats del material per obtenir els efectes desitjats d'il·luminació especular i difusa.

Conclusió

En aquesta secció, hem après sobre els fonaments de la il·luminació i l'ombrejat en gràfics 3D. Hem explorat diferents models d'il·luminació, tipus de fonts de llum i tècniques d'ombrejat, i hem vist exemples pràctics de com implementar-los. Amb aquests coneixements, estem preparats per crear escenes 3D més realistes i visualment atractives.

© Copyright 2024. Tots els drets reservats