Partager via


Matériaux (Direct3D 9)

Les matériaux décrivent comment les polygones réfléchissent la lumière ou semblent émettre de la lumière dans une scène 3D. Les propriétés matérielles détaillent la réflexion diffuse, la réflexion ambiante, l’émission de lumière et les caractéristiques de mise en évidence spéculaire d’un matériau. Direct3D utilise la structure D3DMATERIAL9 pour transporter toutes les informations de propriété matérielle. À l’exception de la propriété spéculaire, chaque propriété est décrite comme une couleur RVBA qui représente la quantité de parties rouges, vertes et bleues d’un type de lumière donné qu’elle reflète, et un facteur de fusion alpha.

Réflexion diffuse et ambiante

Les membres Diffuse et Ambient de la structure D3DMATERIAL9 décrivent comment un matériau reflète la lumière ambiante et diffuse d’une scène. Comme la plupart des scènes contiennent beaucoup plus de lumière diffuse que la lumière ambiante, la réflexion diffuse joue le rôle le plus important dans la détermination de la couleur. De plus, comme la lumière diffuse est directionnelle, l’angle d’incidence de la lumière diffuse affecte l’intensité globale de la réflexion. La réflexion diffuse est la plus grande lorsque la lumière frappe un sommet parallèle au sommet normal. À mesure que l’angle augmente, l’effet de la réflexion diffuse diminue. La quantité de lumière réfléchie est le cosinus de l’angle entre la lumière entrante et le sommet normal, comme le montre l’illustration suivante.

illustration de la quantité de lumière réfléchie

La réflexion ambiante, comme la lumière ambiante, est non directionnelle. La réflexion ambiante a un impact moindre sur la couleur apparente d’un objet rendu, mais elle affecte la couleur globale et est plus visible lorsque peu ou pas de lumière diffuse reflète le matériau. La réflexion ambiante d’un matériau est affectée par l’ensemble de lumière ambiante d’une scène en appelant la méthode IDirect3DDevice9::SetRenderState avec l’indicateur D3DRS_AMBIENT.

La réflexion diffuse et ambiante fonctionnent ensemble pour déterminer la couleur perçue d’un objet et sont généralement des valeurs identiques. Par exemple, pour restituer un objet cristallin bleu, vous créez un matériau qui reflète uniquement la composante bleue de la lumière diffuse et ambiante. Lorsqu’il est placé dans une pièce avec une lumière blanche, le cristal semble être bleu. Toutefois, dans une pièce qui n’a que de la lumière rouge, le même cristal semble être noir, car son matériau ne reflète pas la lumière rouge.

Émission

Les matériaux peuvent être utilisés pour donner l’impression qu’un objet rendu est auto-lumineux. Le membre émissif de la structure D3DMATERIAL9 est utilisé pour décrire la couleur et la transparence de la lumière émise. L’émission affecte la couleur d’un objet et peut, par exemple, rendre un matériau sombre plus lumineux et prendre une partie de la couleur émise.

Vous pouvez utiliser la propriété émissive d’un matériau pour ajouter l’illusion qu’un objet émet de la lumière, sans entraîner la surcharge de calcul liée à l’ajout d’une lumière à la scène. Dans le cas du cristal bleu, la propriété émissive est utile si vous voulez que le cristal semble s’allumer, mais pas sur d’autres objets de la scène. N’oubliez pas que les matériaux ayant des propriétés émissives n’émettent pas de lumière qui peut être réfléchie par d’autres objets d’une scène. Pour obtenir cette lumière réfléchie, vous devez placer une lumière supplémentaire dans la scène.

Réflexion spéculaire

La réflexion spéculaire crée des surbrillances sur les objets, ce qui les rend brillants. La structure D3DMATERIAL9 contient deux membres qui décrivent la couleur de surbrillance spéculaire ainsi que la brillance globale du matériau. Vous établissez la couleur des surbrillances spéculaires en définissant le membre spéculaire sur la couleur RVBA souhaitée - les couleurs les plus courantes sont le blanc ou le gris clair. Les valeurs que vous définissez dans le membre Power contrôlent la netteté des effets spéculaires.

Les mises en évidence spéculaires peuvent créer des effets dramatiques. En tirant à nouveau sur l’analogie de cristal bleu : une valeur Power plus grande crée des surbrillances spéculaires plus nettes, ce qui rend le cristal assez brillant. Les valeurs plus petites augmentent la zone de l’effet, créant un reflet terne qui rend le cristal glacé. Pour rendre un objet vraiment mat, définissez le membre Power sur zéro et la couleur dans Specular sur noir. Expérimentez différents niveaux de réflexion pour produire une apparence réaliste pour vos besoins. L’illustration suivante montre deux modèles identiques. Celle de gauche utilise un pouvoir de réflexion spéculaire de 10 ; le modèle à droite n’a pas de réflexion spéculaire.

illustration de modèles de réflexion spéculaire

Définition des propriétés du matériau

Les appareils de rendu Direct3D peuvent effectuer un rendu avec un ensemble de propriétés matérielles à la fois.

Dans une application C++, vous définissez les propriétés de matériau que le système utilise en préparant une structure D3DMATERIAL9 , puis en appelant la méthode IDirect3DDevice9::SetMaterial .

Pour préparer la structure D3DMATERIAL9 à utiliser, définissez les informations de propriété dans la structure afin de créer l’effet souhaité pendant le rendu. L’exemple de code suivant configure la structure D3DMATERIAL9 pour un matériau violet avec des surbrillances spéculaires blanches nettes.

D3DMATERIAL9 mat;

// Set the RGBA for diffuse reflection.
mat.Diffuse.r = 0.5f;
mat.Diffuse.g = 0.0f;
mat.Diffuse.b = 0.5f;
mat.Diffuse.a = 1.0f;

// Set the RGBA for ambient reflection.
mat.Ambient.r = 0.5f;
mat.Ambient.g = 0.0f;
mat.Ambient.b = 0.5f;
mat.Ambient.a = 1.0f;

// Set the color and sharpness of specular highlights.
mat.Specular.r = 1.0f;
mat.Specular.g = 1.0f;
mat.Specular.b = 1.0f;
mat.Specular.a = 1.0f;
mat.Power = 50.0f;

// Set the RGBA for emissive color.
mat.Emissive.r = 0.0f;
mat.Emissive.g = 0.0f;
mat.Emissive.b = 0.0f;
mat.Emissive.a = 0.0f;

Après avoir préparé la structure D3DMATERIAL9 , vous appliquez les propriétés en appelant la méthode IDirect3DDevice9::SetMaterial de l’appareil de rendu. Cette méthode accepte l’adresse d’une structure D3DMATERIAL9 préparée comme seul paramètre. Vous pouvez appeler IDirect3DDevice9::SetMaterial avec de nouvelles informations si nécessaire pour mettre à jour les propriétés matérielles de l’appareil. L’exemple de code suivant montre à quoi cela peut ressembler dans le code.

// This code example uses the material properties defined for 
// the mat variable earlier in this topic. The pd3dDev is assumed
// to be a valid pointer to an IDirect3DDevice9 interface.
HRESULT hr;
hr = pd3dDev->SetMaterial(&mat);
if(FAILED(hr))
{
    // Code to handle the error goes here.
}

Lorsque vous créez un appareil Direct3D, le matériel actuel est automatiquement défini sur la valeur par défaut indiquée dans le tableau suivant.

Membre Valeur
Diffus (R:0, G:0, B:0, A:0)
Spéculaire (R:0, G:0, B:0, A:0)
Ambiant (R:0, G:0, B:0, A:0)
Émissif (R:0, G:0, B:0, A:0)
Power (0.0)

 

Récupération des propriétés de matériau

Vous récupérez les propriétés matérielles que l’appareil de rendu utilise actuellement en appelant la méthode IDirect3DDevice9::GetMaterial pour l’appareil. Contrairement à la méthode IDirect3DDevice9::SetMaterial , IDirect3DDevice9::GetMaterial ne nécessite pas de préparation. La méthode IDirect3DDevice9::GetMaterial accepte l’adresse d’une structure D3DMATERIAL9 et remplit la structure fournie avec des informations décrivant les propriétés matérielles actuelles avant le retour.

// For this example, the pd3dDev variable is assumed to 
// be a valid pointer to an IDirect3DDevice9 interface.
HRESULT hr;
D3DMATERIAL9 mat;

hr = pd3dDev->GetMaterial(&mat);
if(FAILED(hr))
{
    // Code to handle the error goes here.
}

Notes

Si votre application ne spécifie pas de propriétés de matériau pour le rendu, le système utilise un matériau par défaut. Le matériau par défaut reflète toute la lumière diffuse (blanc, par exemple) sans réflexion ambiante ou spéculaire, et sans couleur émissive.

 

Lumières et matériaux