Specular Lighting (Direct3D 9)

Bei der Modellierung der Spiegelreflexion muss das System nicht nur wissen, in welche Richtung das Licht wandert, sondern auch die Richtung zum Auge des Betrachters. Das System verwendet eine vereinfachte Version des Phong-Spiegelungsmodells, das einen Halbwegvektor verwendet, um die Intensität der spiegelförmigen Reflexion anzunähern.

Der Standardbeleuchtungszustand berechnet keine spiegelförmigen Hervorhebungen. Um eine spiegelfähige Beleuchtung zu aktivieren, müssen Sie D3DRS_SPECULARENABLE auf TRUE festlegen.

Gleichung der spiegelförmigen Beleuchtung

Specular Lighting wird durch die folgende Gleichung beschrieben:

Specular Lighting = Cs * sum[Ls * (N · H)P * Atten * Spot]

 

In der folgenden Tabelle werden die Variablen, ihre Typen und ihre Bereiche angegeben.

Parameter Standardwert type BESCHREIBUNG
Cs (0,0,0,0) D3DCOLORVALUE Spekträre Farbe.
Sum Summation der spiegelförmigen Komponente jedes Lichts.
N D3DVECTOR Scheitelpunkt normal.
H D3DVECTOR Halber Vektor. Sehen Sie sich den Abschnitt zum Halbwegvektor an.
P 0.0 GLEITKOMMAZAHL Spiegelungsstärke. Bereich ist 0 bis +unendlich
Ls (0,0,0,0) D3DCOLORVALUE Helle spekuläre Farbe.
Atten GLEITKOMMAZAHL Lichtdämpfungswert. Siehe Dämpfung und Spotlight-Faktor (Direct3D 9).
Sofortige Zahlung GLEITKOMMAZAHL Spotlight-Faktor. Siehe Dämpfung und Spotlight-Faktor (Direct3D 9).

 

Der Wert für Cs lautet entweder:

if(SPECULARMATERIALSOURCE == D3DMCS_COLOR1)
  C = color1;
  • vertex color1, wenn die spekuläre Materialquelle D3DMCS_COLOR1 ist und die erste Vertexfarbe in der Vertexdeklaration angegeben wird.
  • vertex color2, wenn die spekuläre Materialquelle D3DMCS_COLOR2 ist und die zweite Vertexfarbe in der Vertexdeklaration angegeben wird.
  • material specular color

Hinweis

Wenn eine der Optionen für die spekuläre Materialquelle verwendet wird und die Scheitelpunktfarbe nicht angegeben wird, wird die spekuläre Materialfarbe verwendet.

 

Spekuläre Komponenten werden von 0 bis 255 geklemmt, nachdem alle Leuchten separat verarbeitet und interpoliert werden.

Der Halfway-Vektor

Der Halbwegvektor (H) befindet sich in der Mitte zwischen zwei Vektoren: dem Vektor von einem Objektvertex zur Lichtquelle und dem Vektor von einem Objektvertex zur Kameraposition. Direct3D bietet zwei Möglichkeiten, den Halbwegvektor zu berechnen. Wenn D3DRS_LOCALVIEWER auf TRUE festgelegt ist, berechnet das System den Halbwertvektor unter Verwendung 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) + ldir)

 

Parameter Standardwert type BESCHREIBUNG
Cp D3DVECTOR Kameraposition.
Vp D3DVECTOR Vertexposition.
Ldir D3DVECTOR Richtungsvektor von der Vertexposition zur Lichtposition.

 

Die Bestimmung des halbwegs Vektors auf diese Weise kann rechenintensiv sein. Alternativ dazu wird das System durch festlegen D3DRS_LOCALVIEWER = FALSE angewiesen, so zu handeln, als sei der Standpunkt auf der Z-Achse unendlich weit entfernt. Dies spiegelt sich in der folgenden Formel wider.

H = Norm((0,0,1) + Ldir)

 

Diese Einstellung ist weniger rechenintensiv, aber viel weniger genau, sodass sie am besten von Anwendungen verwendet wird, die orthogonale Projektion verwenden.

Beispiel

In diesem Beispiel wird das Objekt mit der szenenspektaularen Lichtfarbe und einer materialspekträren Farbe gefärbt. 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 Lichtfarbe.

Die folgenden beiden Abbildungen zeigen die farbe des spiegelförmigen Materials( grau) und die spiegelförmige Lichtfarbe, die weiß ist.

Abbildung einer grauen Kugel illustration einer weißen Kugel

Die resultierende spiegelförmige Hervorhebung ist in der folgenden Abbildung dargestellt.

Abbildung des Spiegelhighlights

Die Kombination des Spiegellichts mit der umgebungs- und diffusen Beleuchtung ergibt die folgende Abbildung. Wenn alle drei Beleuchtungsarten angewendet werden, ähnelt diese einem realistischen Objekt deutlicher.

Abbildung der Kombination von Glanzlicht, Umgebungsbeleuchtung und diffuser Beleuchtung

Spiegellicht ist intensiver zu berechnen als diffuse Beleuchtung. Es wird in der Regel verwendet, um visuelle Hinweise auf das Oberflächenmaterial zu geben. Die spekuläre Hervorhebung variiert in Größe und Farbe mit dem Material der Oberfläche.

Lichtmathematik