Superfices e Iluminacion en OpenGL

Hasta ahora la forma de dar color a las primitivas en OpenGL era mediante el llamado a glColor3f() con la que se puede lograr que cada vértice tenga un color y OpenGL se encarga de difuminar este a través de la primitiva que se esté construyendo.

Este tutorial muestra el uso de la iluminación “clásica” en OpenGL (fixed function pipeline) y de la asignación de materiales (color materials) a las superficies. Aún no se tocará el tema de texturas ni de per-pixel lighting que espero revisar en tutoriales posteriores. Como referente es buena idea revisar algún libro o artículo donde se trate la teoría del color, nada muy complicado, con el fin de entender como opera el modelo de color e iluminación en OpenGL y en general las técnicas de CG.

La iluminación en OpenGL está dada por dos componentes, la superficie del objeto, que es asignada a las primitivas y un conjunto de luces “globales” que interactúan con las superficies para dar el aspecto final a los objetos. Tanto en las luces como en la superficie es necesario especificar 3 parámetros: ambiental, difuso y brillo. En el caso de la luz, los parámetros se refieren a la emisión y en el caso de la superficie a la absorción.

COLOR

El color es parte de cada componente, tanto de luz como de superficie. Tanto en la realidad como en OpenGL las fuentes de luz pueden tener todas las componentes de colores (luz blanca), solo algunas (luz de colores) o ninguna, que no tiene ningún paralelo real. En el caso de OpenGL estas componentes son especificadas en la tripleta RGB de siempre.

Para el caso de la superficie se especifica el color que la superficie mostraría en presencia de una luz blanca, aunque en el caso de OpenGL el color de cada componente de superficies es multiplicado por el de la luz para obtener el color resultante.

En el caso de OpenGL el color es una propiedad que se especifica vértice por vértice mediante el llamado de glColor() , el color correspondiente a una textura o el producto de un procesado tipo pex-pixel sobre la superficie de un modelo. Este segmento de código, insertado en la función de render, por ejemplo:

glBegin(GL_POLYGON);
glColor3f(1.0f,1.0f,1.0f);
glVertex3f(-10,15,0);
glColor3f(0.0f,0.0f,0.0f);
glVertex3f(10,5,0);
glColor3f(1.0f,0.0f,0.0f);
glVertex3f(10,-5,0);
glColor3f(0.0f,1.0f,0.0f);
glVertex3f(0,-10,0);
glColor3f(0.0f,0.0f,1.0f);
glVertex3f
glEnd();

Producirá una imagen como esta:

Color

Los colores se expresan en OpenGL mediante una combinación aditiva de rojo (R, Red), verde (G, Green) y azul (B, Blue). El mínimo en los tres valores indica el color negro y el blanco es expresado por los tres colores en su máxima intensidad. Los colores básicos se obtienen con ese color a máxima intensidad y los demás en mínima, mientras que la escala de grises se obtiene con iguales intensidades en los tres colores. Es posible especificar un cuarto parámetro denominado alfa, que corresponde a la cantidad de transparencia de ese vértice en particular. Todas las variaciones de la función glColor() se pueden establecer como:

void glColor[3,4][x](red, green, blue, alpha);

Donde x puede ser cualquiera de los tipos de datos de OpenGL, los cuales se habían visto en un tutorial anterior. Las dos maneras más comunes de expresar un color en OpenGL son la versión escalada del color y la versión “clásica” que generalmente es utilizada en otros API gráficos como GDI. En la primera versión, los colores son expresado con un numero con coma decimal que se encuentra entre 0 y 1, donde 0 implica la menor intensidad de ese color en particular y 1 la máxima. Para el segundo caso se usa un número entero que se encuentra entre 0 y 255. Así, estos dos llamados de funciones serían equivalentes y producirán el mismo resultado:

glColor3f(0.0f,1.0f,0.5f);
glColor3ub((GLubyte)0, (GLubyte)255, (GLubyte)127);

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 😀