Glanzlicht (Direct3D 9)
Das Modellieren von Glanzreflektion erfordert, dass das System nicht nur weiß, in welche Richtung Licht bewegt wird, sondern auch die Richtung zum Auge des Betrachters. Das System verwendet eine vereinfachte Version des Phong-Spiegelungsmodells, das einen Halbvektor verwendet, um die Intensität der Glanzreflektion anzunähern.
Der Standardlichtzustand berechnet keine Glanzlichter. Um die Glanzlichterung zu aktivieren, stellen Sie sicher, dass D3DRS _ SPECULARENABLE auf TRUE festgelegt ist.
Glanzlichtgleichung
Specular Lighting wird durch die folgende Gleichung beschrieben:
Specular Lighting = Cs * sum [ Ls * (N · H)P * Atten * Spot]
In der folgenden Tabelle sind die Variablen, ihre Typen und ihre Bereiche aufgeführt.
| Parameter | Standardwert | type | Beschreibung |
|---|---|---|---|
| Cs | (0,0,0,0) | D3DCOLORVALUE | Glanzfarbe. |
| Sum | NICHT ZUTREFFEND | NICHT ZUTREFFEND | Summierung der Glanzkomponente jedes Lichts. |
| N | NICHT ZUTREFFEND | D3DVECTOR | Scheitelpunktnorm normal. |
| H | NICHT ZUTREFFEND | D3DVECTOR | Halber Vektor. Weitere Informationen finden Sie im Abschnitt zur Hälfte des Vektors. |
| P | 0,0 | GLEITKOMMAZAHL | Glanzreflektionsleistung. Der Bereich ist 0 bis +unendlich. |
| Ls | (0,0,0,0) | D3DCOLORVALUE | Helle Glanzfarbe. |
| Atten | NICHT ZUTREFFEND | GLEITKOMMAZAHL | Leichter Dämpfungswert. Weitere Informationen finden Sie unter Dämpfung und Spotlight-Faktor (Direct3D 9). |
| Sofortige Zahlung | NICHT ZUTREFFEND | GLEITKOMMAZAHL | Spotlight-Faktor. Weitere Informationen finden Sie unter Dämpfung und Spotlight-Faktor (Direct3D 9). |
Der Wert für Cs lautet:
if(SPECULARMATERIALSOURCE == D3DMCS_COLOR1)
C = color1;
- vertex color1, wenn die Spiegelmaterialquelle D3DMCS COLOR1 ist _ und die erste Scheitelpunktfarbe in der Scheitelpunktdeklaration angegeben wird.
- vertex color2, wenn die Spiegelmaterialquelle D3DMCS COLOR2 ist _ und die zweite Scheitelpunktfarbe in der Scheitelpunktdeklaration angegeben wird.
- material specular color (Materialspekularfarbe)
Hinweis
Wenn eine der beiden Quelloptionen für Glanzmaterialien verwendet wird und die Scheitelpunktfarbe nicht angegeben wird, wird die Materialspekularfarbe verwendet.
Glanzkomponenten werden so klammert, dass sie von 0 bis 255 liegen, nachdem alle Beleuchtungen separat verarbeitet und interpoliert wurden.
Der Halbwegvektor
Der halbe Vektor (H) befindet sich in der Mitte zwischen zwei Vektoren: der Vektor von einem Objektvertex zur Lichtquelle und der Vektor von einem Objektvertex zur Kameraposition. Direct3D bietet zwei Möglichkeiten, den Halbvektor zu berechnen. Wenn D3DRS _ LOCALVIEWER auf TRUE festgelegt ist, berechnet das System den Halbvektor anhand der Position der Kamera und der Position des Scheitelpunkts zusammen mit dem Richtungsvektor des Lichts. Die folgende Formel veranschaulicht dies.
H = norm(norm(Cp - Vp) + L dir)
| Parameter | Standardwert | type | Beschreibung |
|---|---|---|---|
| Cp | NICHT ZUTREFFEND | D3DVECTOR | Kameraposition. |
| Vp | NICHT ZUTREFFEND | D3DVECTOR | Vertexposition. |
| Ldir | NICHT ZUTREFFEND | D3DVECTOR | Richtungsvektor von der Scheitelpunktposition zur Lichtposition. |
Die Bestimmung des Halbvektors auf diese Weise kann rechenintensiv sein. Alternativ dazu weist das Festlegen von D3DRS _ LOCALVIEWER = FALSE das System an, so zu handeln, als ob der Blickpunkt auf der Z-Achse unendlich weit entfernt ist. Dies wird in der folgenden Formel widergespiegelt.
H = norm((0,0,1) + L dir)
Diese Einstellung ist weniger rechenintensiv, aber viel weniger genau, daher wird sie am besten von Anwendungen verwendet, die eine orthogonale Projektion verwenden.
Beispiel
In diesem Beispiel wird das Objekt mithilfe der Szenen-Glanzlichtfarbe und einer materialen Glanzfarbe farbig farbig dargestellt. Der Code ist unten dargestellt.
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);
Gemäß der Gleichung ist die resultierende Farbe für die Objektvertices eine Kombination aus der Materialfarbe und der hellen Farbe.
Die folgenden beiden Abbildungen zeigen die Farbe des Glanzmaterials , die grau ist, und die Glanzlichtfarbe, die weiß ist.


Die resultierende Glanzlichtermarkerung wird in der folgenden Abbildung dargestellt.

Die Kombination der Glanzlichter mit der Umgebungs- und diffusen Beleuchtung erzeugt die folgende Abbildung. Wenn alle drei Arten von Beleuchtung angewendet werden, ähnelt dies eindeutiger einem realistischen Objekt.

Die Berechnung der Glanzlichter ist aufwendiger als die diffuse Beleuchtung. Es wird in der Regel verwendet, um visuelle Hinweise zum Oberflächenmaterial bereitzustellen. Die Glanzlichter variieren in Größe und Farbe mit dem Material der Oberfläche.