Share via


Luces y materiales (Direct3D 9)

Las luces se usan para iluminar los objetos de una escena. Cuando se habilita la iluminación, Direct3D calcula el color de cada vértice de objeto en función de una combinación de:

Nota

Esta sección solo es para la canalización de función fija. Los sombreadores programables realizan toda la iluminación explícitamente.

 

  • El color del material actual y los elementos de textura de un mapa de textura asociado.
  • Colores difusos y especulares en el vértice, si se especifican.
  • Color e intensidad de la luz producida por fuentes de luz en la escena o el nivel de luz ambiente de la escena.

Cuando usas la iluminación y los materiales de Direct3D, permites que Direct3D controle los detalles de la iluminación para ti. Los usuarios avanzados pueden realizar iluminación por sí mismos, si lo desea.

La forma de trabajar con iluminación y materiales hace una gran diferencia en la apariencia de la escena representada. Los materiales definen cómo refleja la luz de una superficie. La luz directa y los niveles de luz ambiente definen la luz que se refleja. Debe usar materiales para representar una escena si la iluminación está habilitada. Las luces no son necesarias para representar una escena, pero los detalles de una escena representada sin luz no son visibles. En el mejor de los casos, la representación de una escena sin iluminar da como resultado una silueta de los objetos de la escena. Esto no es suficiente para la mayoría de los propósitos.

Luz directa frente a luz ambiental

Aunque tanto la luz directa como ambiental iluminan objetos en una escena, son independientes entre sí, tienen efectos muy diferentes y requieren que trabaje con ellos de maneras completamente diferentes.

La luz directa es sólo eso: directo. La luz directa siempre tiene dirección y color, y es un factor para los algoritmos de sombreado, como el sombreado Gouraud. Diferentes tipos de luces emiten luz directa de diferentes maneras, creando efectos de atenuación especiales. Cree un conjunto de parámetros de luz para la luz directa llamando al método IDirect3DDevice9::SetLight .

La luz ambiente es eficazmente en todas partes de una escena. Puede considerarlo como un nivel general de luz que llena toda una escena, independientemente de los objetos y sus ubicaciones en esa escena. La luz ambiente no tiene ninguna posición o dirección, solo color e intensidad. Cada luz agrega a la luz ambiente general en una escena. Establezca el nivel de luz ambiente con una llamada al método IDirect3DDevice9::SetRenderState , especificando D3DRS_AMBIENT como parámetro State y el color RGBA deseado como parámetro Value.

El color de la luz ambiente toma la forma de un valor RGBA, donde cada componente es un valor entero de 0 a 255. Esto es a diferencia de la mayoría de los valores de color en Direct3D.

Puede usar la macro D3DCOLOR_RGBA para generar valores RGBA. Los componentes rojo, verde y azul se combinan para hacer el color final de la luz ambiente. El componente alfa controla la transparencia del color. Cuando se usa la aceleración de hardware o la emulación RGB, se omite el componente alfa.

Modelo de luz direct3D frente a naturaleza

Por naturaleza, cuando se emite luz desde un origen, se refleja de cientos, si no miles o millones de objetos antes de llegar al ojo del usuario. Cada vez que se refleja, una luz se absorbe por una superficie, algunas se dispersan en direcciones aleatorias y el resto pasa a otra superficie o al ojo del usuario. Este proceso continúa hasta que la luz se reduce a nada o un usuario percibe la luz.

Obviamente, los cálculos necesarios para simular perfectamente el comportamiento natural de la luz son demasiado lentos de usar para gráficos Direct3D en tiempo real. Por lo tanto, con la velocidad en mente, el modelo de luz direct3D se aproxima a la forma en que funciona la luz en el mundo natural. Direct3D describe la luz en términos de componentes rojo, verde y azul que se combinan para crear un color final.

En Direct3D, cuando la luz refleja una superficie, el color de la luz interactúa matemáticamente con la propia superficie para crear el color que finalmente se muestra en la pantalla. Para obtener información específica sobre los algoritmos que usa Direct3D, consulte Matemáticas de iluminación (Direct3D 9).

El modelo de luz direct3D generaliza la luz en dos tipos: luz ambiente y luz directa. Cada uno tiene atributos diferentes y cada uno interactúa con el material de una superficie de diferentes maneras. La luz ambiente es la luz que se ha dispersado tanto que su dirección y fuente son indeterminadas: mantiene un bajo nivel de intensidad en todas partes. La iluminación indirecta utilizada por los fotógrafos es un buen ejemplo de luz ambiente. La luz ambiente en Direct3D, como en la naturaleza, no tiene ninguna dirección real ni fuente, solo un color e intensidad. De hecho, el nivel de luz ambiente es completamente independiente de cualquier objeto de una escena que genere luz. La luz ambiente no contribuye a la reflexión especular.

La luz directa es la luz generada por una fuente dentro de una escena; siempre tiene color e intensidad, y viaja en una dirección especificada. La luz directa interactúa con el material de una superficie para crear resaltados especulares y su dirección se usa como factor en algoritmos de sombreado, incluido el sombreado gouraud. Cuando se refleja la luz directa, no contribuye al nivel de luz ambiente en una escena. Los orígenes de una escena que generan luz directa tienen diferentes características que afectan a cómo iluminan una escena.

Además, el material de un polígono tiene propiedades que afectan a cómo ese polígono refleja la luz que recibe. Establece un único rasgo de reflectancia que describe cómo el material refleja la luz ambiente y establece rasgos individuales para determinar la reflectancia especular y difusa del material. Para obtener más información, vea Materiales (Direct3D 9).

Valores de color para luces y materiales

Direct3D describe el color en términos de cuatro componentes: rojo, verde, azul y alfa que se combinan para crear un color final. La estructura de C++ D3DCOLORVALUE se define para contener valores para cada componente. Cada miembro es un valor de punto flotante que suele oscilar entre 0,0 y 1,0, ambos incluidos. Aunque tanto las luces como los materiales usan la misma estructura para describir el color, cada uno usa un poco diferente los valores de la estructura.

Los valores de color de los orígenes de luz representan la cantidad de un componente de luz determinado que emite. Dado que las luces no usan un componente alfa, solo los componentes rojo, verde y azul del color son relevantes. Puede visualizar los tres componentes como los lentes rojo, verde y azul en un televisor de proyección. Cada lente puede estar desactivada (un valor de 0,0 en el miembro adecuado), podría ser lo más brillante posible (un valor de 1,0) o podría ser un nivel entre sí. Los colores que llegan a través de las lentes se combinan para hacer el color final de la luz. Una combinación como R(1.0), G(1.0), B(1.0) crea una luz blanca, donde R(0.0), G(0.0), B(0.0) no emite luz en absoluto. Puede hacer una luz que emita solo un componente, lo que da lugar a una luz roja pura, verde o azul; o bien, la luz podría usar combinaciones para emitir colores como amarillo o púrpura. Incluso puede establecer valores de componente de color negativos para crear una "luz oscura" que realmente quite la luz de una escena. O bien, puede establecer los componentes en un valor superior a 1,0 para crear una luz extremadamente brillante.

Por otro lado, con los materiales, los valores de color representan la cantidad de un componente de luz reflejado por una superficie que se representa con ese material. Material cuyos componentes de color son R(1.0), G(1.0), B(1.0), A(1.0) refleja toda la luz que llega a su camino. Del mismo modo, un material con R(0.0), G(1.0), B(0.0), A(1.0) refleja toda la luz verde que se dirige a ella. Los materiales tienen varios valores de reflectancia para crear varios tipos de efectos.

Se incluye información adicional en: Tipos de luz (Direct3D 9) y Propiedades de luz (Direct3D 9).

Introducción