Lampor och material (Direct3D 9)
Ljus används för att belysa objekt i en scen. När belysningen är aktiverad beräknar Direct3D färgen på varje objekthörn baserat på en kombination av:
Not
Det här avsnittet gäller endast pipelinen för fast funktion. Programmerbara skuggor utför all belysning explicit.
- Den aktuella materialfärgen och texellerna i en associerad strukturkarta.
- De diffusa och spektulära färgerna vid brytpunkten, om det anges.
- Färgen och intensiteten av ljus som produceras av ljuskällor i scenen eller scenens omgivande ljusnivå.
När du använder Direct3D-belysning och material låter du Direct3D hantera belysningsinformationen åt dig. Avancerade användare kan utföra belysning på egen hand, om så önskas.
Hur du arbetar med belysning och material gör stor skillnad i utseendet på den renderade scenen. Material definierar hur ljus reflekterar från en yta. Direktljus och omgivande ljusnivåer definierar det ljus som reflekteras. Du måste använda material för att återge en scen om belysning är aktiverat. Ljus krävs inte för att återge en scen, men detaljer i en scen som återges utan ljus är inte synliga. I bästa fall resulterar återgivning av en obelyst scen i en silhuett av objekten i scenen. Detta är inte tillräckligt detaljerat för de flesta ändamål.
Direktljus jämfört med omgivande ljus
Även om både direkt och omgivande ljus lyser upp objekt i en scen, är de oberoende av varandra, de har mycket olika effekter, och de kräver att du arbetar med dem på helt olika sätt.
Direkt ljus är just det: direkt. Direktljus har alltid riktning och färg, och det är en faktor för skuggningsalgoritmer, till exempel Gouraud-skuggning. Olika typer av ljus avger direktljus på olika sätt, vilket skapar speciella dämpningseffekter. Du skapar en uppsättning ljusparametrar för direktljus genom att anropa metoden IDirect3DDevice9::SetLight.
Omgivande ljus är effektivt överallt i en scen. Du kan se det som en allmän ljusnivå som fyller en hel scen, oavsett objekt och deras platser i den scenen. Omgivande ljus har ingen position eller riktning, endast färg och intensitet. Varje ljus bidrar till det övergripande omgivande ljuset i en scen. Ange den omgivande ljusnivån med ett anrop till metoden IDirect3DDevice9::SetRenderState och ange D3DRS_AMBIENT som parametern State och önskad RGBA-färg som värdeparameter.
Omgivande ljusfärg har formen av ett RGBA-värde, där varje komponent är ett heltalsvärde från 0 till 255. Detta skiljer sig från de flesta färgvärden i Direct3D.
Du kan använda D3DCOLOR_RGBA makro för att generera RGBA-värden. De röda, gröna och blå komponenterna kombineras för att göra den slutliga färgen på det omgivande ljuset. Alfakomponenten styr genomskinligheten i färgen. När du använder maskinvaruacceleration eller RGB-emulering ignoreras alfakomponenten.
Direct3D-ljusmodell jämfört med natur
När ljus avges från en källa återspeglas det i naturen av hundratals, om inte tusentals eller miljontals objekt innan det når användarens öga. Varje gång det reflekteras absorberas lite ljus av en yta, vissa är utspridda i slumpmässiga riktningar och resten går vidare till en annan yta eller till användarens öga. Den här processen fortsätter tills ljuset reduceras till ingenting eller en användare uppfattar ljuset.
Det är uppenbart att de beräkningar som krävs för att perfekt simulera ljusets naturliga beteende är för tidskrävande att använda för Direct3D-grafik i realtid. Med snabbhet i åtanke beräknar därför Direct3D-ljusmodellen hur ljuset fungerar i den naturliga världen. Direct3D beskriver ljus när det gäller röda, gröna och blå komponenter som kombineras för att skapa en slutlig färg.
I Direct3D, när ljuset reflekteras från en yta, interagerar den ljusa färgen matematiskt med själva ytan för att skapa den färg som så småningom visas på skärmen. Specifik information om de algoritmer som Direct3D använder finns i Matematik av belysning (Direct3D 9).
Direct3D-ljusmodellen generaliserar ljus i två typer: omgivande ljus och direkt ljus. Var och en har olika attribut, och var och en interagerar med materialet i en yta på olika sätt. Omgivande ljus är ljus som har spridits så mycket att dess riktning och källa är obestämda: det upprätthåller en låg nivå av intensitet överallt. Den indirekta belysning som används av fotografer är ett bra exempel på omgivande ljus. Omgivande ljus i Direct3D, som i naturen, har ingen verklig riktning eller källa, bara en färg och intensitet. Faktum är att den omgivande ljusnivån är helt oberoende av alla objekt i en scen som genererar ljus. Omgivande ljus bidrar inte till spekulativ reflektion.
Direktljus är det ljus som genereras av en källa i en scen. den har alltid färg och intensitet, och den färdas i en angiven riktning. Direktljus interagerar med materialet på en yta för att skapa spektulära markeringar, och dess riktning används som en faktor i skuggningsalgoritmer, inklusive Gouraud-skuggning. När direkt ljus reflekteras bidrar det inte till den omgivande ljusnivån i en scen. Källorna i en scen som genererar direktljus har olika egenskaper som påverkar hur de lyser upp en scen.
Dessutom har en polygons material egenskaper som påverkar hur polygonen reflekterar ljuset den tar emot. Du anger ett enda reflekterande drag som beskriver hur materialet reflekterar omgivande ljus, och du anger enskilda egenskaper för att fastställa materialets spektulära och diffusa reflektans. Mer information finns i Material (Direct3D 9).
Färgvärden för ljus och material
Direct3D beskriver färg i termer av fyra komponenter-röd, grön, blå och alfa-som kombineras för att göra en slutlig färg. Strukturen D3DCOLORVALUE C++ definieras så att den innehåller värden för varje komponent. Varje medlem är ett flyttalsvärde som vanligtvis sträcker sig från 0,0 till 1,0, inklusive. Även om både ljus och material använder samma struktur för att beskriva färg, används värdena i strukturen lite annorlunda av var och en.
Färgvärden för ljuskällor representerar mängden av en viss ljuskomponent som den genererar. Eftersom lampor inte använder en alfakomponent är bara de röda, gröna och blå komponenterna i färgen relevanta. Du kan visualisera de tre komponenterna som de röda, gröna och blå linserna på en projektions-TV. Varje lins kan vara av (ett 0,0-värde i lämplig medlem), det kan vara så ljust som möjligt (ett 1,0-värde), eller så kan det vara någon nivå däremellan. Färgerna som kommer genom linserna kombineras för att göra ljusets slutliga färg. En kombination som R(1.0), G(1.0), B(1.0) skapar ett vitt ljus, där R(0.0), G(0.0), B(0.0) inte avger ljus alls. Du kan göra ett ljus som endast avger en komponent, vilket resulterar i ett rent rött, grönt eller blått ljus. eller så kan ljuset använda kombinationer för att avge färger som gult eller lila. Du kan till och med ange negativa färgkomponentvärden för att skapa ett "mörkt ljus" som faktiskt tar bort ljus från en scen. Eller så kan du ställa in komponenterna på ett värde som är större än 1,0 för att skapa ett extremt starkt ljus.
Med material representerar å andra sidan färgvärden hur mycket av en ljuskomponent som reflekteras av en yta som återges med det materialet. Ett material vars färgkomponenter är R(1.0), G(1.0), B(1.0), A(1.0) återspeglar allt ljus som kommer dess väg. På samma sätt återspeglar ett material med R(0.0), G(1.0), B(0.0), A(1.0) allt grönt ljus som riktas mot det. Material har flera reflektansvärden för att skapa olika typer av effekter.
Ytterligare information finns i: Ljustyper (Direct3D 9)och ljusegenskaper (Direct3D 9).
Relaterade ämnen