Tipos de luz (Direct3D 9)
La propiedad tipo de luz define qué tipo de fuente de luz se usa. El tipo de luz se establece mediante un valor de la enumeración D3DLIGHTTYPE C++ en el miembro Type de la estructura D3DLIGHT9 de la luz. Hay tres tipos de luces en Direct3D: luces puntuales, focos de foco y luces direccionales. Cada tipo ilumina los objetos de una escena de forma diferente, con distintos niveles de sobrecarga computacional.
Luz puntual
Las luces de punto tienen color y posición dentro de una escena, pero ninguna dirección única. Dan luz igualmente en todas las direcciones, como se muestra en la ilustración siguiente.
Una bombilla es un buen ejemplo de una luz puntual. Las luces puntuales se ven afectadas por la atenuación y el rango, e iluminan una malla sobre una base de vértice por vértice. Durante la iluminación, Direct3D usa la posición de la luz de punto en el espacio mundial y las coordenadas del vértice que se iluminan para derivar un vector para la dirección de la luz y la distancia que ha recorrido la luz. Ambos se utilizan, junto con el vértice normal, para calcular la contribución de la luz a la iluminación de la superficie.
Luz direccional
Las luces direccionales solo tienen color y dirección, no posición. Emiten luz paralela. Esto significa que toda la luz generada por las luces direccionales viaja a través de una escena en la misma dirección. Imagine una luz direccional como una fuente de luz a una distancia casi infinita, como el sol. Las luces direccionales no se ven afectadas por la atenuación o el intervalo, por lo que la dirección y el color que especifique son los únicos factores que se tienen en cuenta cuando Direct3D calcula los colores del vértice. Debido al pequeño número de factores de iluminación, estas son las luces menos intensivas computacionalmente que se usarán.
Foco
Los focos de luz tienen color, posición y dirección en la que emiten luz. La luz emitida desde un foco se compone de un cono interno brillante y un cono exterior más grande, con la intensidad de la luz disminuyendo entre los dos, como se muestra en la ilustración siguiente.
Los focos de luz se ven afectados por la caída, la atenuación y el rango. Estos factores, así como la distancia que la luz viaja a cada vértice, se ilustran en cuando se calculan efectos de iluminación para objetos de una escena. Calcular estos efectos para cada vértice hace que los focos de luz consuman más tiempo computacionalmente de todas las luces en Direct3D.
La estructura de C++ D3DLIGHT9 contiene tres miembros que solo usan los elementos destacados. Estos miembros, Falloff, Theta y Phi, controlan el tamaño o el tamaño de los conos internos y externos de un objeto de foco, y cómo disminuye la luz entre ellos.
El valor Theta es el ángulo radian del cono interno del foco de luz, y el valor Phi es el ángulo para el cono exterior de la luz. El valor Falloff controla cómo disminuye la intensidad de la luz entre el borde exterior del cono interno y el borde interno del cono externo. La mayoría de las aplicaciones establecen Falloff en 1.0 para crear una caída que se produce uniformemente entre los dos conos, pero puede establecer otros valores según sea necesario.
En la ilustración siguiente se muestra la relación entre los valores de estos miembros y cómo pueden afectar a los conos internos y externos de un foco de luz.
Los focos emiten un cono de luz que tiene dos partes: un cono interno brillante y un cono externo. La luz es más brillante en el cono interno y no está presente fuera del cono exterior, con intensidad de luz atenuada entre las dos áreas. Este tipo de atenuación se conoce normalmente como caída.
La cantidad de luz que recibe un vértice se basa en la ubicación del vértice en los conos internos o externos. Direct3D calcula el producto de punto del vector de dirección del foco (L) y el vector de la luz al vértice (D). Este valor es igual al coseno del ángulo entre los dos vectores y actúa como indicador de la posición del vértice que se puede comparar con los ángulos de cono de la luz para determinar dónde podría estar el vértice en los conos internos o externos. En la ilustración siguiente se proporciona una representación gráfica de la asociación entre estos dos vectores.
El sistema compara este valor con el coseno de los ángulos de cono interno y externo del foco. En la estructura D3DLIGHT9 de la luz, los miembros Theta y Phi representan los ángulos totales de cono para los conos internos y externos. Dado que la atenuación se produce cuando el vértice se aleja del centro de iluminación (en lugar del ángulo total del cono), el tiempo de ejecución divide estos ángulos de cono en la mitad antes de calcular sus cosines.
Si el producto de puntos de vectores L y D es menor o igual que el coseno del ángulo del cono exterior, el vértice se encuentra más allá del cono exterior y no recibe luz. Si el producto de punto de L y D es mayor que el coseno del ángulo de cono interno, el vértice está dentro del cono interno y recibe la cantidad máxima de luz, considerando la atenuación en la distancia. Si el vértice está en algún lugar entre las dos regiones, la caída se calcula con la ecuación siguiente.
Donde:
- I f es la intensidad de la luz después de la caída
- Alfa es el ángulo entre vectores L y D.
- Theta es el ángulo de cono interno
- Phi es el ángulo del cono externo
- p es la caída
Esta fórmula genera un valor entre 0,0 y 1,0 que escala la intensidad de la luz en el vértice para tener en cuenta la caída. También se aplica la atenuación como factor de la distancia del vértice desde la luz. En el gráfico siguiente se muestra cómo pueden afectar los distintos valores de caída a la curva de caída.
El efecto de varios valores de caída en la iluminación real es sutil y se incurre en una pequeña penalización de rendimiento al dar forma a la curva de caída con valores de caída distintos de 1,0. Por estos motivos, este valor se establece normalmente en 1.0.
Temas relacionados