É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.
La mise en surbrillance spéculaire obtenue est illustrée dans l’illustration suivante.
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.
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.
Rubriques connexes