Dela via


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.

bild av en grå sfär bild av en röd sfär

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.

bild av en sfär med diffus belysning

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.

bild av en sfär med diffus belysning och omgivande belysning

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.

matematik för belysning