Superfices e Iluminacion en OpenGL

Componente Ambiental (Ambient)

La luz ambiental es comúnmente asociada a la rayos que inciden sobre el objeto de desde todas direcciones, por lo que no generan ningún tipo de sombreado sin importar la forma del objeto y su posición con respecto a la cámara. En la realidad este tipo de luz se origina cuando la luz rebota sucesivamente en diferentes superficies hasta que llega al objeto observado, haciendo parecer a este simplemente mas “claro”, de manera homogénea. Es importante ver que excepto en muy raras ocasiones, no es posible observar esta componente por separado, sino sin que sin importar si la luz proviene del sol o de una fuente artificial, hay un poco de cada componente en todos los objetos observados en la realidad.

Componente Difuso (Diffuse)

En este caso los rayos provienen de una fuente puntual (la fuente es identificable), pero al caer sobre el objeto rebotan dispersándose en diferentes ángulos, por lo que el objeto aparecerá mas iluminado en unas zonas que en otras. La forma en que el objeto es iluminado dependerá entonces de su forma y de la relación de posiciones cámara-objeto-fuenteDeLuz.

Componente Brillo (Specular)

Algunas fuentes de luz tienden a producir rayos “compactos” y paralelos, como por ejemplo el sol y los arreglos en rejilla que se colocan en los fluorescentes de oficinas. Este tipo de luces cuando inciden sobre objetos “brillantes” como metales pulidos, vidrio, pisos encerados, automóviles limpios y encerados, etc, producen zonas donde la luz se refleja mas intensamente, debido a que los rayos rebotan casi paralelos. Esta configuración es altamente dependiente de la ubicación de la fuente de luz, el objeto, el observador y de la forma del objeto. Los objetos denominados “mate” son aquellos que poseen muy poco componente de brillo, debido a las características del material.

Componentes de luz

El core de la especificación clásica de OpenGL (anterior a glsl) no soporta técnicas avanzadas y mas realistas como hdri, shadow-volume, PPL, raytracing en tiempo real, etc.

LUCES

OpenGL usa un modelo simplificado para simular la iluminación en el mundo real que utiliza un algoritmo para calcular los valores de iluminación en un vértice determinado (Phong) y otro para difuminar los diferentes valores a través de la superficie de la primitiva (guround).

La activación del modelo de luz se hace mediante:

glEnable(GL_LIGHTING);

Luego es necesario al menos activar una luz así:

glEnable(GL_LIGHT0);

La especificación indica que los fabricantes de hardware deben proveer mínimo 8 luces de este tipo que van desde GL_LIGHT0 hasta GL_LIGHT7. Antes de usar cualquier luz es necesario ajustar algunos parámetros mediante la función:

void glLight{if}( enum light, enum pname, T param );
void glLight{if}v( enum light, enum pname, T params );

Donde el primer dato corresponde al número de la luz a ajustar, GL_LIGHT0 por ejemplo, pname es el parámetro a ajustar y params son los valores del parámetro. Es posible utilizar flotante o enteros y especificar uno por uno, o utilizar un vector. Los parámetros para las luces son:

  • GL_AMBIENT
  • GL_DIFFUSE
  • GL_SPECULAR
  • GL_POSITION

Así por ejemplo el conjunto de llamados para activar la luz 0 se vería así:

GLfloat ambientlight[]  =	{0.5f ,0.5f ,0.5f ,1.0f};
GLfloat difuselight[]   =	{1.0f ,1.0f ,1.0f ,1.0f};
GLfloat specularlight[] =	{1.0f ,1.0f ,1.0f ,1.0f};
GLfloat lightposition[] =	{0.0f,100.0f,0.0f,1.0f};

glLightfv(GL_LIGHT0,GL_AMBIENT,ambientlight);
glLightfv(GL_LIGHT0,GL_DIFFUSE,difuselight);
glLightfv(GL_LIGHT0,GL_SPECULAR,specularlight);
glLightfv(GL_LIGHT0,GL_POSITION,lightposition);

Lo que ajustaría una luz puntual omnidireccional blanca a media intensidad ambiental y ubicada a 100 unidades sobre el eje Y+. El cuarto parámetro de la posición de la luz (w) se puede utilizar para indicar que la luz se encuentra a una distancia “infinita” (w=0) en la dirección (x,y,z) , que a efectos prácticos hace que todos los objetos de la escena parezcan iluminados por un tipo de “sol” o fuente de rayos paralelos similar. Esta ultima particularidad es muy utilizada por los modeladores comerciales para tener una buena percepción de los objetos en la escena.

Es posible especificar un tipo de luz que no sea omnidireccional, es decir un spot, que es asimilable con la luz de una linterna o luz de estudio, que se difunde formando un cono.Para hacerlo basta modificar las siguientes propiedades de la luz:

  • GL_SPOT_DIRECCION : Un vector de 4 componentes que indica en coordenadas de vista la dirección de la luz
  • GL_SPOT_EXPONENT : Es un entero o flotante entre 1 y 128 que indica la atenuación de la luz a medida que aumenta el ángulo con respecto al foco central de la luz.
  • GL_SPOT_CUTOFF : Indica el ángulo máximo al cual el spot ilumina. Los valores son entre 0 y 90.

Spotlight

Este tipo de iluminación es raramente utilizada debido a que su calidad depende de la cantidad de polígonos que posea el modelo a iluminar, entre mayor sea la cantidad el efecto de una luz suave y uniforme será mejor, pero así mismo caerá el rendimiento en general.

1 2 3

Compartir esta entrada

DiggReddit
  • http://yahoo.com Anel Lopez Guido

    exelentes exposiciones en opengl cual sujerencia ami correo

  • Kriss

    :roll: ummm no entendi :(

  • isaac

    gracias por los ejemplos me han servido de mucho

  • carlos

    men sabees utilizarlo en java?

  • Pingback: Superfices e iluminacion en opengl | Curso Manual Tutorial()

  • http://dejuv3d.es.tl 6mon

    men, ¿como no hay un parametro para la intensidad de la luz? o ¿como hago para que los objetos que se alejan de la luz se oscurescan, y los que se acercan se aclaren?

  • Transtor

    Gracias me sirvio salu2 desde Puebla…

  • http://black-byte.com Jotatsu

    Saludos 😀