É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.
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.
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.
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.
Rubriques connexes