Iluminación difusa (Direct3D 9)

Después de ajustar la intensidad de la luz para cualquier efecto de atenuación, el motor de iluminación calcula la cantidad de luz restante refleja desde un vértice, dado el ángulo del vértice normal y la dirección de la luz del incidente. El motor de iluminación salta a este paso para las luces direccionales porque no atenuan a lo largo de la distancia. El sistema considera dos tipos de reflexión, difusos y especulares, y usa una fórmula diferente para determinar la cantidad de luz que se refleja para cada uno. Después de calcular las cantidades de luz reflejadas, Direct3D aplica estos nuevos valores a las propiedades de reflectancia difusa y especular del material actual. Los valores de color resultantes son los componentes difusos y especulares que utiliza el rasterizador para producir sombreado Gouraud y resaltado especular.

La iluminación difusa se describe mediante la siguiente ecuación.

Iluminación difusa = sum[Cd*Ld*(N.Ldir)*Atten*Spot]

Parámetro Valor predeterminado Tipo Descripción
Sum N/D N/D Sumación del componente difuso de cada luz.
Cd (0,0,0,0) D3DCOLORVALUE Color difuso.
Ld (0,0,0,0) D3DCOLORVALUE Color difuso claro.
No N/D D3DVECTOR Vértice normal
Ldir N/D D3DVECTOR Vector de dirección del vértice del objeto a la luz.
Atten N/D FLOAT Atenuación de luz. Consulta Atenuación y Factor de foco (Direct3D 9).
Zona N/D FLOAT Factor destacado. Consulta Atenuación y Factor de foco (Direct3D 9).

 

El valor de Cd es:

  • color de vértice1, si DIFFUSEMATERIALSOURCE = D3DMCS_COLOR1 y el primer color de vértice se proporciona en la declaración de vértice.
  • color de vértice2, si DIFFUSEMATERIALSOURCE = D3DMCS_COLOR2 y el segundo color de vértice se proporciona en la declaración de vértice.
  • color difuso del material

Nota

Si se usa la opción DIFFUSEMATERIALSOURCE y no se proporciona el color del vértice, se utiliza el color difuso del material.

 

Para calcular la atenuación (Atten) o las características de foco de foco (Spot), consulta Atenuación y Factor de foco (Direct3D 9).

Los componentes difusos se sujetan de 0 a 255, después de que todas las luces se procesen e interpolan por separado. El valor de iluminación difusa resultante es una combinación de los valores de luz ambiental, difuso y emisivo.

Ejemplo

En este ejemplo, el objeto se colorea utilizando el color difuso claro y un color difuso de material. El código se muestra a continuación.

D3DMATERIAL9 mtrl;
ZeroMemory( &mtrl, sizeof(mtrl) );

D3DLIGHT9 light;
ZeroMemory( &light, sizeof(light) );
light.Type = D3DLIGHT_DIRECTIONAL;

D3DXVECTOR3 vecDir;
vecDir = D3DXVECTOR3(0.5f, 0.0f, -0.5f);
D3DXVec3Normalize( (D3DXVECTOR3*)&light.Direction, &vecDir );

// set directional light diffuse color
light.Diffuse.r = 1.0f;
light.Diffuse.g = 1.0f;
light.Diffuse.b = 1.0f;
light.Diffuse.a = 1.0f;
m_pd3dDevice->SetLight( 0, &light );
m_pd3dDevice->LightEnable( 0, TRUE );

// if a material is used, SetRenderState must be used
// vertex color = light diffuse color * material diffuse color
mtrl.Diffuse.r = 0.75f;
mtrl.Diffuse.g = 0.0f;
mtrl.Diffuse.b = 0.0f;
mtrl.Diffuse.a = 0.0f;
m_pd3dDevice->SetMaterial( &mtrl );
m_pd3dDevice->SetRenderState(D3DRS_DIFFUSEMATERIALSOURCE, D3DMCS_MATERIAL);

Según la ecuación, el color resultante para los vértices del objeto es una combinación del color del material y el color claro.

Las dos ilustraciones siguientes muestran el color del material, que es gris, y el color claro, que es rojo brillante.

illustration of a gray sphereillustration of a red sphere

La escena resultante se muestra en la ilustración siguiente. El único objeto de la escena es una esfera. El cálculo de iluminación difusa toma el material y el color difuso claro y lo modifica por el ángulo entre la dirección de la luz y el vértice normal utilizando el producto de punto. Como resultado, la parte posterior de la esfera se vuelve más oscura cuando la superficie de la esfera se aleja de la luz.

illustration of a sphere with diffuse lighting

La combinación de la iluminación difusa con la iluminación ambiental del ejemplo anterior sombrea toda la superficie del objeto. La luz ambiental sombrea toda la superficie y la luz difusa ayuda a revelar la forma 3D del objeto, como se muestra en la ilustración siguiente.

illustration of a sphere with diffuse lighting and ambient lighting

La iluminación difusa es más intensiva para calcular que la iluminación ambiental. Dado que depende de los valores normales de vértice y la dirección de la luz, puede ver la geometría de los objetos en el espacio 3D, lo que produce una iluminación más realista que la iluminación ambiental. Puede usar resaltados especulares para lograr un aspecto más realista.

Matemáticas de iluminación