AGREGAR
UN SOMBREADO A UN POLIGONO EN OPENGL
Es un método
manejado por OpenGl que es de tal uso para rellenar de color los polígonos que
se estén realizando en el ámbito de la graficacion.
Antes que
nada se especifica haciendo uso de 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();
Tecnicas
de sombreado clasicas 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 iluminaciona un objeto necesitamos asociar un vector normal a cada
vertice 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 Acumulacion
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 θ.
COMO SE
AGREGAN LOS RELLENOS DE POLIGONOS EN OPENGL
Dentro
del par glBegin, glEnd solo pueden ir instrucciones OpenGL para definir objetos
tales como vértices, y colores (existen otras más complejas como normales y
materiales) y no transformaciones ni cambios de estado (diferentes a los
especificados), adicionalmente dentro del par pueden ir instrucciones de
programación del lenguaje tales que ciclos, condicionales, llamados a
funciones, etc.
GlBegin (GL_POLYGON)’;
glColor3f (1.0, 0.0,
0.0); // rojo
For (int i=0; i<10;
i++){
glVertex3f (1.0/i,
i*i, 0.0);
}
glColor3f
(0.0, 1.0, 0.0); // verde
glVertex3f (1.0, 0.0,
0.0);
glColor3f
(0.0, 0.0, 1.0); // azul
glVertex3f
(1.0, 1.0, 0.0);
glEnd();
La
función glColor define el color de rellenado actual y lleva como parámetros los
valores de las componentes RGB del color deseado y, opcionalmente, un cuarto
parámetro con el valor alpha. Estos parámetros son flotantes y se mueven en el
rango [0.0, 1.0].
glColor3
[f] [v]: para cambiar el color actual de dibujo,
puede estar en bloque glBegin/glEnd