Freigeben über


Materialien (Direct3D 9)

Materialien beschreiben, wie Polygone Licht reflektieren oder in einer 3D-Szene Licht ausstrahlen. Materialeigenschaften beschreiben die diffuse Reflexion, die Umgebungsreflexion, die Lichtemission und die Glanzlichtmerkmale eines Materials. Direct3D verwendet die D3DMATERIAL9-Struktur , um alle Materialeigenschafteninformationen zu übertragen. Mit Ausnahme der Specular-Eigenschaft wird jede Eigenschaft als RGBA-Farbe beschrieben, die den Anteil der roten, grünen und blauen Teile eines bestimmten Lichttyps darstellt, der reflektiert wird, und ein Alphamischungsfaktor.

Diffuse und Umgebungsreflexion

Die Elemente Diffuse und Ambient der D3DMATERIAL9-Struktur beschreiben, wie ein Material das umgebungs- und diffuse Licht in einer Szene reflektiert. Da die meisten Szenen viel diffusere Licht als Umgebungslicht enthalten, spielt die diffuse Reflexion die größte Rolle bei der Farbbestimmung. Da diffuses Licht richtungsmäßig ist, wirkt sich der Einfallswinkel für diffuses Licht auf die Gesamtintensität der Reflexion aus. Diffuse Reflexion ist am größten, wenn das Licht auf einen Scheitelpunkt trifft, der parallel zum Scheitelpunkt normal ist. Wenn der Winkel zunimmt, verringert sich die Wirkung der diffusen Reflexion. Die Menge des reflektierten Lichts ist der Kosinus des Winkels zwischen dem einströmenden Licht und dem Scheitelpunkt normal, wie in der folgenden Abbildung gezeigt.

Abbildung der Menge des reflektierten Lichts

Umgebungsreflektion, wie Umgebungslicht, ist nicht direkt. Die Umgebungsreflektion hat einen geringeren Einfluss auf die scheinbare Farbe eines gerenderten Objekts, wirkt sich jedoch auf die Gesamtfarbe aus und ist am auffälligsten, wenn wenig oder kein diffuses Licht vom Material reflektiert wird. Die Umgebungsreflektion eines Materials wird durch das für eine Szene festgelegte Umgebungslicht beeinflusst, indem die IDirect3DDevice9::SetRenderState-Methode mit dem D3DRS_AMBIENT-Flag aufgerufen wird.

Diffuse und Umgebungsreflektion arbeiten zusammen, um die wahrgenommene Farbe eines Objekts zu bestimmen, und sind in der Regel identische Werte. Um z. B. ein blaues kristallines Objekt zu rendern, erstellen Sie ein Material, das nur die blaue Komponente des diffusen und Umgebungslichts reflektiert. Wenn er in einem Raum mit weißem Licht platziert wird, erscheint der Kristall blau. In einem Raum, der nur rotes Licht hat, scheint der gleiche Kristall jedoch schwarz zu sein, da sein Material kein rotes Licht reflektiert.

Emission

Materialien können verwendet werden, um ein gerendertes Objekt selbstleuchtend erscheinen zu lassen. Der emissive Member der D3DMATERIAL9-Struktur wird verwendet, um die Farbe und Transparenz des emittierten Lichts zu beschreiben. Die Emission wirkt sich auf die Farbe eines Objekts aus und kann beispielsweise ein dunkles Material heller machen und einen Teil der ausgegebenen Farbe annehmen.

Sie können die emissive Eigenschaft eines Materials verwenden, um die Illusion hinzuzufügen, dass ein Objekt Licht ausgibt, ohne den Rechenaufwand für das Hinzufügen eines Lichts zur Szene zu verursachen. Im Fall des blauen Kristalls ist die emissive Eigenschaft nützlich, wenn Sie den Kristall zum Leuchten bringen möchten, aber nicht Licht auf andere Objekte in der Szene werfen möchten. Denken Sie daran, dass Materialien mit emissiven Eigenschaften kein Licht ausstrahlen, das von anderen Objekten in einer Szene reflektiert werden kann. Um dieses reflektierte Licht zu erreichen, müssen Sie ein zusätzliches Licht innerhalb der Szene platzieren.

Spiegelung

Spiegelung erzeugt Hervorhebungen auf Objekten und lässt sie glänzend erscheinen. Die D3DMATERIAL9-Struktur enthält zwei Elemente, die die Glanzlichtfarbe sowie die Gesamtglanz des Materials beschreiben. Sie legen die Farbe der Glanzlichter fest, indem Sie den Specular-Member auf die gewünschte RGBA-Farbe festlegen . Die häufigsten Farben sind Weiß oder Hellgrau. Die Werte, die Sie im Power-Member festlegen, steuern, wie scharf die Glanzeffekte sind.

Glanzlichter können dramatische Effekte erzeugen. Wieder auf die blaue Kristall-Analogie zurück: Ein größerer Power-Wert erzeugt schärfere Glanzlichter, wodurch der Kristall recht glänzend erscheint. Kleinere Werte vergrößern die Fläche des Effekts, wodurch eine dumpfe Reflexion entsteht, die den Kristall frostig aussehen lassen. Um ein Objekt wirklich matt zu machen, legen Sie den Power-Member auf 0 und die Farbe in Specular auf Schwarz fest. Experimentieren Sie mit verschiedenen Reflexionsebenen, um ein realistisches Aussehen für Ihre Bedürfnisse zu erzeugen. Die folgende Abbildung zeigt zwei identische Modelle. Die auf der linken Seite verwendet eine Spiegelungsstärke von 10; Das Modell auf der rechten Seite weist keine Spiegelung auf.

Abbildung von Spiegelungsmodellen

Festlegen von Materialeigenschaften

Direct3D-Renderinggeräte können jeweils mit einem Satz von Materialeigenschaften gerendert werden.

In einer C++-Anwendung legen Sie die vom System verwendeten Materialeigenschaften fest, indem Sie eine D3DMATERIAL9-Struktur vorbereiten und dann die IDirect3DDevice9::SetMaterial-Methode aufrufen.

Um die D3DMATERIAL9-Struktur für die Verwendung vorzubereiten, legen Sie die Eigenschafteninformationen in der -Struktur fest, um den gewünschten Effekt während des Renderings zu erzeugen. Im folgenden Codebeispiel wird die D3DMATERIAL9-Struktur für ein violettes Material mit scharfen weißen Glanzlichter eingerichtet.

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;

Nachdem Sie die D3DMATERIAL9-Struktur vorbereitet haben, wenden Sie die Eigenschaften an, indem Sie die IDirect3DDevice9::SetMaterial-Methode des Renderinggeräts aufrufen. Diese Methode akzeptiert die Adresse einer vorbereiteten D3DMATERIAL9-Struktur als einzigen Parameter. Sie können IDirect3DDevice9::SetMaterial mit neuen Informationen aufrufen, um die Materialeigenschaften für das Gerät zu aktualisieren. Im folgenden Codebeispiel wird gezeigt, wie dies im Code aussehen kann.

// 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.
}

Wenn Sie ein Direct3D-Gerät erstellen, wird das aktuelle Material automatisch auf die in der folgenden Tabelle gezeigte Standardeinstellung festgelegt.

Member Wert
Diffus (R:0, G:0, B:0, A:0)
Glänzend (R:0, G:0, B:0, A:0)
Umgebend (R:0, G:0, B:0, A:0)
Selbstleuchtend (R:0, G:0, B:0, A:0)
Leistung (0.0)

 

Abrufen von Materialeigenschaften

Sie rufen die Materialeigenschaften ab, die das Renderinggerät derzeit verwendet, indem Sie die IDirect3DDevice9::GetMaterial-Methode für das Gerät aufrufen. Im Gegensatz zur IDirect3DDevice9::SetMaterial-Methode ist für IDirect3DDevice9::GetMaterial keine Vorbereitung erforderlich. Die IDirect3DDevice9::GetMaterial-Methode akzeptiert die Adresse einer D3DMATERIAL9-Struktur und füllt die bereitgestellte Struktur mit Informationen, die die aktuellen Materialeigenschaften beschreiben, bevor sie zurückgegeben wird.

// 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.
}

Hinweis

Wenn Ihre Anwendung keine Materialeigenschaften für das Rendern angibt, verwendet das System ein Standardmaterial. Das Standardmaterial reflektiert das gesamte diffuse Licht - z. B. weiß - ohne Umgebungs- oder Glanzreflexion und ohne emissive Farbe.

 

Leuchten und Materialien