Delen via


Specular Lighting (Direct3D 9)

Modellering van speculatieve reflectie vereist dat het systeem niet alleen weet in welke richting het licht reist, maar ook de richting naar het oog van de kijker. Het systeem maakt gebruik van een vereenvoudigde versie van het Phong specular-reflectiemodel, dat een halve vector gebruikt om de intensiteit van speculatieve reflectie te benaderen.

De standaardverlichtingsstatus berekent geen speculaire markeringen. Als u speculatieve verlichting wilt inschakelen, moet u D3DRS_SPECULARENABLE instellen op TRUE-.

Speculaire verlichtingsvergelijking

Specular Lighting wordt beschreven door de volgende vergelijking:

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

 

In de volgende tabel worden de variabelen, hun typen en hun bereiken geïdentificeerd.

Parameter Standaardwaarde Type Beschrijving
Cs (0,0,0,0) D3DCOLORVALUE Speculaire kleur.
som N.V.T N.V.T Optellen van de speculaire component van elk licht.
N N.V.T. D3DVECTOR Hoekpunt normaal.
H N.V.T D3DVECTOR Halverwege vector. Zie de sectie over de halve-weg vector.
P 0.0 DRIJVEN Speculatieve reflectiekracht. Bereik is 0 tot +oneindig
Ls (0,0,0,0) D3DCOLORVALUE Speculaire lichtkleur.
Atten N.V.T. DRIJVEN Lichtverzwakkingswaarde. Zie Attenuation and Spotlight Factor (Direct3D 9).
Plek N.V.T DRIJVEN Spotlightfactor Zie Attenuation and Spotlight Factor (Direct3D 9).

 

De waarde voor Cₛ is of:

if(SPECULARMATERIALSOURCE == D3DMCS_COLOR1)
  C = color1;
  • hoekpuntkleur1, als de bron van het speculaire materiaal D3DMCS_COLOR1 is en de eerste hoekpuntkleur wordt opgegeven in de declaratie van het hoekpunt.
  • hoekpuntkleur2, als de bron van het speculaire materiaal D3DMCS_COLOR2 is en de tweede hoekpuntkleur wordt geleverd in de declaratie van het hoekpunt.
  • materiaal spiegelingskleur

Notitie

Als een van de opties voor de bron van speculair materiaal wordt gebruikt en de hoekpuntkleur niet wordt opgegeven, wordt de materiaalspeculatiekleur gebruikt.

 

Speculaire componenten worden beperkt tot een bereik van 0 tot 255, nadat alle lichten afzonderlijk zijn verwerkt en geïnterpoleerd.

De Halfwegvector

De halve vector (H) bestaat halverwege tussen twee vectoren: de vector van een objecthoek naar de lichtbron en de vector van een objectpunt naar de camerapositie. Direct3D biedt twee manieren om de halfwegvector te berekenen. Wanneer D3DRS_LOCALVIEWER is ingesteld op TRUE, berekent het systeem de halve vector met behulp van de positie van de camera en de positie van het hoekpunt, samen met de richtingsvector van het licht. In de volgende formule ziet u dit.

H = norm(norm(Cp - Vp) + Ldir)

 

Parameter Standaardwaarde Type Beschrijving
Cp N.V.T D3DVECTOR Camerapositie.
Vp N.V.T D3DVECTOR Hoekpuntpositie.
Ldir N.V.T D3DVECTOR Richtingsvector van hoekpuntpositie tot lichtpositie.

 

Het bepalen van de halve vector op deze manier kan rekenintensief zijn. Als alternatief zorgt het instellen van D3DRS_LOCALVIEWER = FALSE ervoor dat het systeem zich gedraagt alsof het uitkijkpunt zich op een oneindig verre afstand langs de z-as bevindt. Dit wordt weergegeven in de volgende formule.

H = norm((0,0;1) + Ldir)

 

Deze instelling is minder rekenintensief, maar veel minder nauwkeurig, dus het wordt het beste gebruikt door toepassingen die orthogonale projectie gebruiken.

Voorbeeld

In dit voorbeeld wordt het object gekleurd met behulp van de speculaire lichtkleur van de scène en een speculaire kleur van het materiaal. De code wordt hieronder weergegeven.

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);

Volgens de vergelijking is de resulterende kleur voor de objecthoeken een combinatie van de materiaalkleur en de lichte kleur.

In de volgende twee afbeelding ziet u de kleur van het speculaire materiaal, die grijs is en de speculaire lichtkleur, die wit is.

illustratie van een grijze bol illustratie van een witte bol

De resulterende speculaire markering wordt weergegeven in de volgende afbeelding.

illustratie van de speculaire markering

Het combineren van de speculaire markering met de omgevings- en diffuse verlichting produceert de volgende afbeelding. Als alle drie de soorten verlichting zijn toegepast, lijkt dit duidelijker op een realistisch object.

illustratie van het combineren van de speculaire markering, omgevingsverlichting en diffuse verlichting

Speculaire verlichting is intensiever te berekenen dan diffuse verlichting. Het wordt meestal gebruikt om visuele aanwijzingen te geven over het oppervlakmateriaal. De speculaire markering varieert in grootte en kleur met het materiaal van het oppervlak.

Wiskunde van Verlichting