Partager via


Éclairage spéculaire (Direct3D 9)

La modélisation de la réflexion spéculaire nécessite que le système sache non seulement dans quelle direction la lumière se déplace, mais aussi la direction vers l’œil du spectateur. Le système utilise une version simplifiée du modèle de réflexion spéculaire de Phong, qui utilise un vecteur à mi-chemin pour se rapprocher de l’intensité de la réflexion spéculaire.

L’état d’éclairage par défaut ne calcule pas les surbrillances spéculaires. Pour activer l’éclairage spéculaire, veillez à définir D3DRS_SPECULARENABLE sur TRUE.

Équation d’éclairage spéculaire

L’éclairage spéculaire est décrit par l’équation suivante :

Éclairage spéculaire = Cs * somme[Ls * (N · H)P * Atten * Spot]

 

Le tableau suivant identifie les variables, leurs types et leurs plages.

Paramètre Valeur par défaut Type Description
Cs (0,0,0,0) D3DCOLORVALUE Couleur spéculaire.
Sum N/A N/A Somme du composant spéculaire de chaque lumière.
N N/A D3DVECTOR Vertex normal.
H N/A D3DVECTOR Vecteur à mi-chemin. Consultez la section sur le vecteur à mi-parcours.
P 0,0 FLOAT Puissance de réflexion spéculaire. La plage est comprise entre 0 et +infini
Ls (0,0,0,0) D3DCOLORVALUE Couleur spéculaire claire.
Atten N/A FLOAT Valeur d’atténuation légère. Consultez Atténuation et facteur de mise en évidence (Direct3D 9).
Zone N/A FLOAT Facteur de mise en avant. Consultez Atténuation et facteur de mise en évidence (Direct3D 9).

 

La valeur pour Cs est :

if(SPECULARMATERIALSOURCE == D3DMCS_COLOR1)
  C = color1;
  • vertex color1, si la source de matériau spéculaire est D3DMCS_COLOR1 et que la première couleur de vertex est fournie dans la déclaration de vertex.
  • couleur de vertex2, si la source de matériau spéculaire est D3DMCS_COLOR2 et que la deuxième couleur de vertex est fournie dans la déclaration de vertex.
  • couleur spéculaire matérielle

Notes

Si l’une des options de source de matériau spéculaire est utilisée et que la couleur de vertex n’est pas fournie, la couleur spéculaire du matériau est utilisée.

 

Les composants spéculaires sont bridés pour être de 0 à 255, une fois que toutes les lumières sont traitées et interpolées séparément.

Vecteur à mi-chemin

Le vecteur de demi-voie (H) existe à mi-chemin entre deux vecteurs : le vecteur d’un vertex d’objet vers la source de lumière et le vecteur d’un vertex d’objet vers la position de la caméra. Direct3D fournit deux façons de calculer le vecteur à mi-parcours. Lorsque D3DRS_LOCALVIEWER est défini sur TRUE, le système calcule le vecteur à mi-chemin à l’aide de la position de la caméra et de la position du sommet, ainsi que du vecteur de direction de la lumière. La formule suivante illustre cela.

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

 

Paramètre Valeur par défaut Type Description
Cp N/A D3DVECTOR Position de l'appareil photo.
Vp N/A D3DVECTOR Position du vertex.
Ldir N/A D3DVECTOR Vecteur de direction de la position du vertex à la position de lumière.

 

La détermination du vecteur à mi-parcours de cette manière peut être gourmande en calculs. En guise d’alternative, la définition de D3DRS_LOCALVIEWER = FALSE indique au système d’agir comme si le point de vue était infiniment distant sur l’axe z. Cela se reflète dans la formule suivante.

H = norm(((0,0,1) + Ldir)

 

Ce paramètre est moins gourmand en calculs, mais beaucoup moins précis. Il est donc préférable d’utiliser les applications qui utilisent la projection orthogonale.

Exemple

Dans cet exemple, l’objet est coloré à l’aide de la couleur de lumière spéculaire de la scène et d’une couleur spéculaire matérielle. Le code est illustré ci-dessous.

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);

Selon l’équation, la couleur résultante pour les sommets de l’objet est une combinaison de la couleur du matériau et de la couleur claire.

Les deux illustrations suivantes montrent la couleur du matériau spéculaire, qui est gris, et la couleur claire spéculaire, qui est blanche.

illustration d’une image de sphère grise d’une sphère blanche

La mise en surbrillance spéculaire obtenue est illustrée dans l’illustration suivante.

illustration de la mise en surbrillance spéculaire

La combinaison de la mise en évidence spéculaire avec l’éclairage ambiant et diffus produit l’illustration suivante. Avec les trois types d’éclairage appliqués, cela ressemble plus clairement à un objet réaliste.

illustration de la combinaison de la mise en surbrillance spéculaire, de l’éclairage ambiant et de l’éclairage diffus

L’éclairage spéculaire est plus intensif à calculer que l’éclairage diffus. Il est généralement utilisé pour fournir des indices visuels sur le matériau de surface. La mise en surbrillance spéculaire varie en taille et en couleur avec le matériau de la surface.

Mathématiques de l’éclairage