Unidad
IV
Como
agregar un sombreado a un polígono en OpenGL
Es el método que utiliza OpenGL para rellenar de color
los polígonos. Se especifica con la función glShadeModel. Si el parámetro es
GL_FLAT, ogl rellenará los polígonos con el color activo en el momento que se
definió el último parámetro; si es GL_SMOOTH, ogl rellenará el polígono
interpolando los colores activos en la definición de cada vértice.
Este código es un ejemplo de GL_FLAT:
glShadeModel(GL_FLAT);
glBegin(GL_TRIANGLES);
glColor3f(1.0f,
0.0f, 0.0f); // activamos el color rojo
glVertex3f(-1.0f, 0.0f, 0.0f);
glColor3f(0.0f, 1.0f, 0.0f); // activamos el color verde
glVertex3f(1.0f,
0.0f, 0.0f);
glColor3f(0.0f,
0.0f, 1.0f); // activamos el color azul
glVertex3f(0.0f,
1.0f, 0.0f);
glEnd();
Técnicas
de sombreado clásicas y avanzadas
Clásicas: Iluminación local.
Luces que no son extensas, como las reales, sino
inextensas, puntuales. Y, por añadidura, se relacionan con los objetos como
mónadas aisladas, sin tener en cuenta la interacción entre ellos. Esto explica
lo artificioso de muchas de las técnicas que se describirán más adelante y que
buscan compensar estas limitaciones.
Cálculos de iluminación por vértices
Para aplicar iluminación a un objeto necesitamos
asociar un vector normal a cada vértice del objeto. Cuando tenemos la normal
calculada tenemos que normalizarla, o sea, dividir ese vector por su propio
modulo para que sea unitario, pero también podemos hacer que se encargue la
OpengGl activando la normalización con el comando glEnable GL_NORMALIZE o
desactivarla con glDisable GL_NORMALIZE.
El usar GL_NORMALIZE dependerá de nuestra aplicación ya
que si forzamos a que sea OpenGl el que las utilice se ralentiza por que le
estamos obligando a hacer mas cálculos de los que debe.
Para definir las normales en opengl utilizaremos la
función glNormal3f(X,Y,Z) por ejemplo para definir una cara con 4 vértices la
definiremos de la siguiente manera:
GlBegin GL_QUADS
glNormal3f nX,nY,nZ
glvertex3f x,y,z
glvertex3f x,y,z
glvertex3f x,y,z
glvertex3f x,y,z
glEnd
Renderizado en Tiempo real
La idea fundamental del procesado en tiempo real es que
todos los objetos deben ser descompuestos en polígonos. Estos polígonos serán
descompuestos a su vez en triángulos. Cada triángulo será proyectado sobre la
ventana bidimensional y rellenado con los colores adecuados para reflejar los
efectos de la iluminación, texturas, etc. Una vez se han generado los
triángulos, en la pipeline existen dos partes claramente diferenciadas: una
primera etapa operaciones realizadas sobre cada uno de los vértices, y después
de que éstos se proyecten sobre la ventana, entonces comienza una segunda fase
de cálculos realizados para cada pixel cubierto por triángulos.
Realistas: iluminación global
Son aquellos en los que se considera que la intensidad
de luz en un punto de la superficie de un objeto se debe a las fuentes
luminosas y al resto de los elementos existentes en la escena.
Realistas: Iluminación global
Son sencillos y rápidos pero proporcionan imágenes muy
simples, que no representan adecuadamente el modo en que la luz ilumina los
objetos y los espacios. Esto no quiere decir que no sean útiles para un gran
número de casos, y es muy importante calibrar adecuadamente que es lo que se
necesita, pues puede muy bien ocurrir que un cálculo local proporcione imágenes
relativamente esquemáticas pero más adecuadas para la representación de un
proyecto.
Trazado de rayos
El trazado de rayos computa la interacción de la luz
desde un punto de vista determinado y es particularmente adecuado para
superficies reflectantes. Puede utilizarse como propiedad especifica de un
determinado material. Se traza un rayo desde la posición del observador a
través de cada uno de los píxeles del plano de proyección (una de las ventajas
del raytracing es que los rayos que se procesan son sólo los rayos que parten
del observador ),
Radiosidad
Está basado en principios generales que se pueden
encontrar en un manual general sobre rendering. En el estadio inicial la escena
consta de dos tipos de objetos: objetos que emiten luz y objetos que reciben luz.
A partir de aquí, en una primera vuelta, se computa la luz que recibe cada
objeto o, en una aproximación más exacta, cada parte de un objeto, según una
subdivisión cuya densidad puede precisarse en sucesivas aproximaciones.
Cálculos de iluminación por pixel
La iluminación por píxel en tiempo real es una
tecnología revolucionaria ofrecida como primicia por NVIDIA Shading Rasterizer.
La iluminación dinámica a nivel de píxel libera a los desarrolladores de las
restricciones de otros sistemas de iluminación y pone a su alcance toda una
gama de sofisticados efectos. Antes de que el color final del píxel sea
decidido, un cálculo de iluminación debe ser computado para sombrear a los
píxeles basados en alguna luz que puede estar presente en la escena.
Alto Acabado
Sombreado Constante o plano. Un cálculo para todo el
polígono. Obtenemos una intensidad que aplicamos a un conjunto de puntos de un
objeto (p.ej. todo un triángulo). Aceleramos el proceso de síntesis. Correcto
si se verifica: Fuente de luz en el infinito. Observador en el infinito. El
polígono representa una superficie plana real del objeto que se modela y no es
una aproximación de un objeto curvo.
Sombreado Constante o Plano
Obtenemos una intensidad que aplicamos a un conjunto de
puntos de un objeto
*Aceleramos el proceso de síntesis
*Correcto si se verifica.
* Fuente de luz en el infinito
*Observador en el infinito
Modelo de Reflexión Phong
El modelo de reflexión de Phong es eficiente y
suficientemente aproximado a la realidad física para producir buenas imágenes,
bajo una variedad de condiciones de luz y propiedades de materiales. Apoya los
tres tipos de interacciones material-luz: ambiente, difusa y especular. Si se
tiene un conjunto de fuentes puntos, con componentes independientes para cada
uno de los tres colores primarios para cada uno de los tres tipos de
interacciones material-luz.
Ray Tracing
En muchas formas, ray tracing es una extensión al
enfoque de rendering con un modelo de iluminación local. Está basado en la
observación previa que, de los rayos de luz saliendo de una fuente, los únicos
que contribuyen a la imagen son aquellos que entran al lente de la cámara
sintética y pasan por el centro de proyección.
Buffer Stencil.
Stencill Buffer es una memoria intermedia que analiza y
actualiza píxeles (con sus operaciones) junto con “depth buffer” o buffer de
profundidad. Añade planos de bits adicionales para cada píxel además de los
bits de color y profundidad.
Stencil buffer es similar al buffer de profundidad en
que los dos son colección de planos de bit que no se pueden mostrar. Del mismo
modo que el buffer de profundidad asocia a cada píxel de la ventana un valor de
profundidad, el stencil buffer asocia su propio valor a cada píxel mostrado.
Cuando el buffer de profundidad esta activado los valores de profundidad son
usados para aceptar o rechazar fragmentos, del mismo modo los valores de
Stencil buffer son usados para aceptar o rechazar fragmentos.
Buffer de Acumulación
Normalmente se usa un buffer de acumulación para unir
las 2 imágenes.
Fuentes de Luz
La luz puede dejar una superficie mediante dos procesos
fundamentales:
• Emisión
propia
• Reflexión
Normalmente se piensa en una fuente de luz como un
objeto que emite luz solo mediante fuentes de energía internas, sin embargo,
una fuente de luz, como un foco, puede reflejar alguna luz incidente a esta del
ambiente.
Fuentes de Luz
La luz puede dejar una superficie mediante dos procesos
fundamentales:
* Emisión propia
* Reflexión
Luz Ambiente
La luz ambiente ilumina por igual todas las zonas en
sombra para simular el efecto de interacción entre objetos que hace que las
partes en sombra de los objetos queden parcialmente iluminadas.
Spotlights (direccionales)
Los spotlights se caracterizan por un rango delgado de
ángulos por los cuales se emite luz. Se puede construir un spotlight sencillo
de una fuente de punto limitando los ángulos de donde la luz de la fuente se
puede ver. Se puede usar un cono cuyo ápice está en ps, apuntando en la dirección
ls, y cuyo ancho está determinado por el ángulo θ.