Share via


Iluminación especular (Direct3D 9)

La reflexión especular de modelado requiere que el sistema no solo sepa en qué dirección viaja la luz, sino también la dirección hacia el ojo del espectador. El sistema utiliza una versión simplificada del modelo de reflexión especular Phong, que emplea un vector medio para aproximar la intensidad de la reflexión especular.

El estado de iluminación predeterminado no calcula los resaltados especulares. Para habilitar la iluminación especular, asegúrese de establecer D3DRS_SPECULARENABLE en TRUE.

Ecuación de iluminación especular

La iluminación especular se describe mediante la siguiente ecuación:

Iluminación especular = Cs * sum[Ls * (N · H)P * Atten * Spot]

 

En la tabla siguiente se identifican las variables, sus tipos y sus intervalos.

Parámetro Valor predeterminado Tipo Descripción
Cs (0,0,0,0) D3DCOLORVALUE Color especular.
Sum N/D N/D Sumación del componente especular de cada luz.
No N/D D3DVECTOR Vértice normal.
H N/D D3DVECTOR Vector medio. Consulte la sección sobre el vector medio.
P 0,0 FLOAT Potencia especular de reflexión. El intervalo es de 0 a +infinito
Ls (0,0,0,0) D3DCOLORVALUE Color especular claro.
Atten N/D FLOAT Valor de 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 Cs es:

if(SPECULARMATERIALSOURCE == D3DMCS_COLOR1)
  C = color1;
  • color de vértice1, si la fuente de material especular es D3DMCS_COLOR1 y el primer color de vértice se proporciona en la declaración de vértice.
  • color de vértice2, si la fuente de material especular es D3DMCS_COLOR2 y el segundo color de vértice se proporciona en la declaración de vértice.
  • color especular del material

Nota

Si se usa una opción de origen de material especular y no se proporciona el color del vértice, se utiliza el color especular del material.

 

Los componentes especulares se sujetan para que sean de 0 a 255, después de que todas las luces se procesen e interpolan por separado.

Vector medio

El vector medio (H) existe a medio camino entre dos vectores: el vector de un vértice de objeto a la fuente de luz y el vector de un vértice de objeto a la posición de la cámara. Direct3D proporciona dos maneras de calcular el vector medio. Cuando D3DRS_LOCALVIEWER se establece en TRUE, el sistema calcula el vector medio utilizando la posición de la cámara y la posición del vértice, junto con el vector de dirección de la luz. La fórmula siguiente ilustra esto.

H = norm(norm(Cp - Vp) + Ldir)

 

Parámetro Valor predeterminado Tipo Descripción
Cp N/D D3DVECTOR Posición de la cámara.
Vp N/D D3DVECTOR Posición del vértice.
Ldir N/D D3DVECTOR Vector de dirección de la posición del vértice a la posición de la luz.

 

La determinación del vector medio de esta manera puede ser de gran uso computacional. Como alternativa, establecer D3DRS_LOCALVIEWER = FALSE indica al sistema que actúe como si el punto de vista estuviera infinitamente distante en el eje z. Esto se refleja en la fórmula siguiente.

H = norm((0,0,1) +L dir)

 

Esta configuración es menos intensiva a nivel computacional, pero mucho menos precisa, por lo que se usa mejor en las aplicaciones que usan proyección ortogonal.

Ejemplo

En este ejemplo, el objeto se colorea utilizando el color de luz especular de la escena y un color especular del 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 );

light.Specular.r = 1.0f;
light.Specular.g = 1.0f;
light.Specular.b = 1.0f;
light.Specular.a = 1.0f;

light.Range = 1000;
light.Falloff = 0;
light.Attenuation0 = 1;
light.Attenuation1 = 0;
light.Attenuation2 = 0;
m_pd3dDevice->SetLight( 0, &light );
m_pd3dDevice->LightEnable( 0, TRUE );
m_pd3dDevice->SetRenderState( D3DRS_SPECULARENABLE, TRUE );

mtrl.Specular.r = 0.5f;
mtrl.Specular.g = 0.5f;
mtrl.Specular.b = 0.5f;
mtrl.Specular.a = 0.5f;
mtrl.Power = 20;
m_pd3dDevice->SetMaterial( &mtrl );
m_pd3dDevice->SetRenderState(D3DRS_SPECULARMATERIALSOURCE, 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.

En la ilustración siguiente se muestra el color del material especular, que es gris, y el color de luz especular, que es blanco.

Ilustración de una ilustración de esfera grisde una esfera blanca

El resaltado especular resultante se muestra en la ilustración siguiente.

ilustración del resaltado especular

La combinación del resaltado especular con la iluminación ambiental y difusa genera la siguiente ilustración. Con los tres tipos de iluminación aplicados, esto se parece más claramente a un objeto realista.

ilustración de la combinación del resaltado especular, la iluminación ambiental y la iluminación difusa

La iluminación especular es más intensiva para calcular que la iluminación difusa. Normalmente se usa para proporcionar pistas visuales sobre el material de superficie. El resaltado especular varía en tamaño y color con el material de la superficie.

Matemáticas de iluminación