Partager via


Éclairage diffus (Direct3D 9)

Après avoir ajusté l’intensité lumineuse pour les effets d’atténuation éventuels, le moteur d’éclairage calcule la quantité de lumière restante réfléchie à partir d’un sommet, compte tenu de l’angle de la normale du sommet et de la direction de la lumière incidente. Le moteur d’éclairage passe à cette étape pour les feux directionnels, car ils ne s’atténuent pas sur la distance. Le système prend en compte deux types de réflexion, diffus et spéculaire, et utilise une formule différente pour déterminer la quantité de lumière réfléchie pour chacun d’eux. Après avoir calculé les quantités de lumière réfléchie, Direct3D applique ces nouvelles valeurs aux propriétés de réflectance diffuse et spéculaire du matériau actuel. Les valeurs de couleur qui en résultent sont les composants diffus et spéculaires que le rastériseur utilise pour produire l’ombrage Gouraud et la mise en surbrillance spéculaire.

L’éclairage diffus est décrit par l’équation suivante.

Éclairage diffus = sum[Cd*Ld*(N.Lir)*Atten*Spot]

Paramètre Valeur par défaut Type Description
Sum N/A N/A Somme du composant diffus de chaque lumière.
Cd (0,0,0,0) D3DCOLORVALUE Couleur diffuse.
Ld (0,0,0,0) D3DCOLORVALUE Couleur diffuse claire.
N N/A D3DVECTOR Vertex normal
Ldir N/A D3DVECTOR Vecteur de direction du sommet de l’objet vers la lumière.
Atten N/A FLOAT Atténuation de la lumière. Consultez Atténuation et facteur à la une (Direct3D 9).
Zone N/A FLOAT Facteur à la une. Consultez Atténuation et facteur à la une (Direct3D 9).

 

La valeur de Cd est :

  • couleur de vertex1, si DIFFUSEMATERIALSOURCE = D3DMCS_COLOR1 et que la première couleur de vertex est fournie dans la déclaration de vertex.
  • couleur de vertex2, si DIFFUSEMATERIALSOURCE = D3DMCS_COLOR2, et que la deuxième couleur de vertex est fournie dans la déclaration de vertex.
  • couleur diffuse du matériau

Notes

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

 

Pour calculer l’atténuation (Atten) ou les caractéristiques à la une (Spot), consultez Atténuation et facteur à la une (Direct3D 9) .

Les composants diffus sont fixés pour être de 0 à 255, après que tous les voyants ont été traités et interpolés séparément. La valeur d’éclairage diffus obtenue est une combinaison des valeurs de lumière ambiante, diffuse et émissive.

Exemple

Dans cet exemple, l’objet est coloré à l’aide de la couleur diffuse de la lumière et d’une couleur diffuse de matériau. 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 );

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

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, qui est le gris, et la couleur claire, qui est rouge vif.

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

La scène résultante est illustrée dans l’illustration suivante. Le seul objet de la scène est une sphère. Le calcul de l’éclairage diffus prend le matériau et la couleur diffuse de la lumière et les modifie par l’angle entre la direction de la lumière et le sommet normal à l’aide du produit de point. Par conséquent, la face arrière de la sphère s’assombrit à mesure que la surface de la sphère s’écarte de la lumière.

illustration d’une sphère avec éclairage diffus

La combinaison de l’éclairage diffus avec l’éclairage ambiant de l’exemple précédent ombrage la surface entière de l’objet. La lumière ambiante ombrage la surface entière et la lumière diffuse permet de révéler la forme 3D de l’objet, comme illustré dans l’illustration suivante.

illustration d’une sphère avec éclairage diffus et éclairage ambiant

L’éclairage diffus est plus intensif à calculer que l’éclairage ambiant. Étant donné que cela dépend des normales de vertex et de la direction de la lumière, vous pouvez voir la géométrie des objets dans l’espace 3D, ce qui produit un éclairage plus réaliste que l’éclairage ambiant. Vous pouvez utiliser des surbrillances spéculaires pour obtenir un look plus réaliste.

Mathématiques de l’éclairage