Diffus belysning (Direct3D 9)
Efter justering av ljusintensiteten för eventuella dämpningseffekter beräknar belysningsmotorn hur mycket av det återstående ljuset som reflekteras från ett hörn, med tanke på hörnens normala vinkel och riktningen för incidentljuset. Belysningsmotorn hoppar över till det här steget för riktningsljus eftersom de inte försvagas över avstånd. Systemet tar hänsyn till två reflektionstyper, diffusa och spekulativa, och använder en annan formel för att avgöra hur mycket ljus som reflekteras för var och en. När du har beräknat mängden ljus som reflekteras tillämpar Direct3D dessa nya värden på egenskaperna för diffus och spekulativ reflektans i det aktuella materialet. De resulterande färgvärdena är de diffusa och spekulativa komponenter som rastreringen använder för att producera Gouraud-skuggning och spektulär markering.
Diffus belysning beskrivs av följande ekvation.
Diffus belysning = summa[Cd*Ld*(N.Ldir)*Atten*Spot]
Parameter | Standardvärde | Typ | Beskrivning |
---|---|---|---|
summa | Ej tillämpligt | Ej tillämpligt | Sammanfattning av varje ljuss diffusa komponent. |
Cd | (0,0,0,0) | D3DCOLORVALUE | Diffus färg. |
Ld | (0,0,0,0) | D3DCOLORVALUE | Ljus diffus färg. |
N | Ej tillämpligt | D3DVECTOR | Hörn normal |
Ldir | Ej tillämpligt | D3DVECTOR | Riktningsvektor från objekthörnet till ljuset. |
Atten | Ej tillämpligt | FLYTA | Ljusdämpning. Se Attenuation och Spotlight Factor (Direct3D 9). |
Fläck | Ej tillämpligt | FLYT | Spotlight-faktor. Se Dämpning och Spotlight-faktor (Direct3D 9). |
Värdet för Cd är antingen:
- hörnfärg1, om DIFFUSEMATERIALSOURCE = D3DMCS_COLOR1, och den första hörnfärgen anges i hörndeklarationen.
- hörnfärg 2, om DIFFUSEMATERIALSOURCE = D3DMCS_COLOR2, och den andra hörnfärgen anges i hörndeklarationen.
- diffus materialfärg
Not
Om något av alternativen DIFFUSEMATERIALSOURCE används och hörnfärgen inte tillhandahålls används materialets diffusa färg.
Information om hur du beräknar attenuation (Atten) eller spotlight-egenskaperna (Spot) finns i Attenuation och Spotlight Factor (Direct3D 9).
Diffusa komponenter är fastklämda för att vara från 0 till 255, efter att alla lampor bearbetas och interpoleras separat. Det resulterande diffusa belysningsvärdet är en kombination av de omgivande, diffusa och emitterande ljusvärdena.
Exempel
I det här exemplet färgas objektet med hjälp av ljus diffus färg och en material diffus färg. Koden visas nedan.
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 );
// set directional light diffuse color
light.Diffuse.r = 1.0f;
light.Diffuse.g = 1.0f;
light.Diffuse.b = 1.0f;
light.Diffuse.a = 1.0f;
m_pd3dDevice->SetLight( 0, &light );
m_pd3dDevice->LightEnable( 0, TRUE );
// if a material is used, SetRenderState must be used
// vertex color = light diffuse color * material diffuse color
mtrl.Diffuse.r = 0.75f;
mtrl.Diffuse.g = 0.0f;
mtrl.Diffuse.b = 0.0f;
mtrl.Diffuse.a = 0.0f;
m_pd3dDevice->SetMaterial( &mtrl );
m_pd3dDevice->SetRenderState(D3DRS_DIFFUSEMATERIALSOURCE, D3DMCS_MATERIAL);
Enligt ekvationen är den resulterande färgen för objekthörnarna en kombination av materialfärgen och den ljusa färgen.
Följande två illustrationer visar materialfärgen, som är grå, och ljusfärgen, som är ljusröd.
Den resulterande scenen visas i följande bild. Det enda objektet i scenen är en sfär. Beräkningen av diffus belysning tar hänsyn till materialet och ljusets diffusa färg och modifierar det efter vinkeln mellan ljusriktningen och vertex normalen med hjälp av punktprodukten. Som ett resultat blir sfärens baksida mörkare när sfärens yta böjer sig bort från ljuset.
Genom att kombinera den diffusa belysningen med den omgivande belysningen från föregående exempel skuggar man hela objektets yta. Det omgivande ljuset skuggar hela ytan och det diffusa ljuset hjälper till att avslöja objektets 3D-form, som visas i följande bild.
Diffus belysning är mer intensiv att beräkna än omgivande belysning. Eftersom det beror på hörnens normalitet och ljusriktning kan du se objektens geometri i 3D-utrymme, vilket ger en mer realistisk belysning än omgivande belysning. Du kan använda spektulära markeringar för att få ett mer realistiskt utseende.
Relaterade ämnen