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.
De resulterende speculaire markering wordt weergegeven in de volgende afbeelding.
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.
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.
Verwante onderwerpen