Anyagok (Direct3D 9)
Az anyagok azt írják le, hogy a sokszögek hogyan tükrözik a fényt, vagy hogyan jelennek meg, hogy fényt bocsátanak ki egy 3D jelenetben. Az anyag tulajdonságai részletesen ismertetik az anyag diffúz visszaverődését, a környezeti visszaverődést, a fénykibocsátást és a specular highlight jellemzőket. A Direct3D a D3DMATERIAL9 struktúrát használja az összes anyagtulajdonság-információ hordozására. A specular tulajdonság kivételével minden tulajdonság RGBA-színként van leírva, amely egy adott fénytípus piros, zöld és kék részeinek, valamint egy alfa-keverési tényezőnek felel meg.
Diffúz és környezeti tükröződés
A D3DMATERIAL9 szerkezet diffúz és környezeti tagjai azt írják le, hogy egy anyag hogyan tükrözi a környezeti és diffúz fényt egy jelenetben. Mivel a legtöbb jelenet sokkal diffúz fényt tartalmaz, mint a környezeti fény, a diffúz tükröződés játszik a legnagyobb szerepet a szín meghatározásában. Továbbá, mivel a diffúz fény irányban van, a diffúz fény előfordulási szöge befolyásolja a tükröződés általános intenzitását. A diffúz tükröződés akkor a legnagyobb, ha a fény a csúcspont normál csúcsával párhuzamos csúcsot üt. A szög növekedésével a diffúz visszaverődés hatása csökken. A visszavert fény mennyisége a bejövő fény és a csúcspont közötti szög koszinusza, ahogyan az az alábbi ábrán is látható.
A környezeti tükröződés, mint a környezeti fény, nem irányított. A környezeti tükröződés kisebb hatással van a renderelt objektumok látszólagos színére, de hatással van a teljes színre, és a legszembetűnőbb, ha kevés vagy egyetlen diffúz fény sem tükrözi az anyagot. Az anyag környezeti tükröződését befolyásolja egy jelenet környezeti fényhalmaza a IDirect3DDevice9::SetRenderState metódus meghívásával a D3DRS_AMBIENT jelzővel.
A diffúz és a környezeti visszaverődés együtt határozza meg egy objektum érzékelt színét, és általában azonos értékek. Például egy kék kristályos objektum megjelenítéséhez olyan anyagot hoz létre, amely csak a diffúz és a környezeti fény kék összetevőjét tükrözi. Amikor egy fehér fényű szobába helyezik, a kristály kéknek tűnik. Azonban egy olyan helyiségben, ahol csak vörös fény van, ugyanaz a kristály fekete lenne, mert anyaga nem tükrözi a vörös fényt.
Emisszió
Az anyagok felhasználhatók arra, hogy a renderelt objektumok önfeledtnek tűnjenek. A D3DMATERIAL9 szerkezet emisszív tagja a kibocsátott fény színének és átlátszóságának leírására szolgál. Az emisszió hatással van az objektum színére, és például világosabbá teheti a sötét anyagot, és a kibocsátott szín egy részét is átveszi.
Egy anyag megengedő tulajdonságával azt az illúziót keltheti, hogy egy objektum fényt bocsát ki, anélkül, hogy a számítási többletterhelést a jelenethez adna. A kék kristály esetében az engedelmes tulajdonság akkor hasznos, ha azt szeretné, hogy a kristály felvilágosuljon, de a jelenet többi objektumára nem vet fényt. Ne feledje, hogy a megengedő tulajdonságokkal rendelkező anyagok nem bocsátanak ki fényt, amelyet a jelenet más objektumai is tükrözhetnek. Ennek a tükröződő fénynek a eléréséhez további fényt kell elhelyeznie a jeleneten belül.
Spekuláris tükröződés
A spekulatív tükröződés kiemeli az objektumokat, így azok fényesek lesznek. A D3DMATERIAL9 szerkezet két tagot tartalmaz, amelyek leírják a specular highlight színét, valamint az anyag általános fényességét. A specular highlights színét úgy állapíthatja meg, hogy a Specular tagot a kívánt RGBA színre állítja - a leggyakoribb színek a fehér vagy a világosszürke. A Power-tagban beállított értékek szabályozzák, hogy milyen élesek a spekuláris hatások.
A specular highlights drámai hatásokat okozhat. Rajzolás ismét a kék kristály analógiára: egy nagyobb Power érték élesebb spekuláns kiemeléseket hoz létre, így a kristály meglehetősen fényesnek tűnik. A kisebb értékek növelik a hatás területét, így tompa tükröződés jön létre, amely fagyossá teszi a kristályt. Ahhoz, hogy egy objektum valóban matt legyen, állítsa a Power tagot nullára, a Specular színét pedig fekete színre. Kísérletezzen különböző tükröződési szintekkel, hogy reális megjelenést biztosítsunk az igényeinek. Az alábbi ábrán két azonos modell látható. A bal oldali a 10-ből álló spekuláris visszaverődési erőt használja; a jobb oldali modellnek nincs spekuláris tükröződése.
Anyagtulajdonságok beállítása
A Direct3D-renderelő eszközök egyszerre egyetlen anyagtulajdonság-készlettel jeleníthetők meg.
Egy C++ alkalmazásban a rendszer által használt anyagtulajdonságokat egy D3DMATERIAL9-struktúra előkészítésével állítja be, majd meghívja a IDirect3DDevice9::SetMaterial metódust.
A D3DMATERIAL9 szerkezet használatra való előkészítéséhez állítsa be a szerkezet tulajdonságadatait a kívánt hatás létrehozásához a renderelés során. Az alábbi példakód egy lila anyag D3DMATERIAL9 szerkezetét állítja be éles fehér színkiemelésekkel.
D3DMATERIAL9 mat;
// Set the RGBA for diffuse reflection.
mat.Diffuse.r = 0.5f;
mat.Diffuse.g = 0.0f;
mat.Diffuse.b = 0.5f;
mat.Diffuse.a = 1.0f;
// Set the RGBA for ambient reflection.
mat.Ambient.r = 0.5f;
mat.Ambient.g = 0.0f;
mat.Ambient.b = 0.5f;
mat.Ambient.a = 1.0f;
// Set the color and sharpness of specular highlights.
mat.Specular.r = 1.0f;
mat.Specular.g = 1.0f;
mat.Specular.b = 1.0f;
mat.Specular.a = 1.0f;
mat.Power = 50.0f;
// Set the RGBA for emissive color.
mat.Emissive.r = 0.0f;
mat.Emissive.g = 0.0f;
mat.Emissive.b = 0.0f;
mat.Emissive.a = 0.0f;
A D3DMATERIAL9 szerkezet előkészítése után a tulajdonságokat a renderelő eszköz IDirect3DDevice9::SetMaterial metódusának meghívásával alkalmazhatja. Ez a módszer egyetlen paraméterként fogadja el az előkészített D3DMATERIAL9-struktúra címét. Meghívhatja IDirect3DDevice9::SetMaterial az eszköz anyagtulajdonságainak frissítéséhez szükséges új információkkal. Az alábbi példakód bemutatja, hogyan jelenhet meg ez a kódban.
// This code example uses the material properties defined for
// the mat variable earlier in this topic. The pd3dDev is assumed
// to be a valid pointer to an IDirect3DDevice9 interface.
HRESULT hr;
hr = pd3dDev->SetMaterial(&mat);
if(FAILED(hr))
{
// Code to handle the error goes here.
}
Direct3D-eszköz létrehozásakor az aktuális anyag automatikusan az alábbi táblázatban látható alapértelmezett értékre van állítva.
Tag | Érték |
---|---|
Diffúz | (R:0, G:0, B:0, A:0) |
Tükröző | (R:0, G:0, B:0, A:0) |
Környező | (R:0, G:0, B:0, A:0) |
Emissive | (R:0, G:0, B:0, A:0) |
Hatalom | (0.0) |
Anyagtulajdonságok lekérése
A renderelő eszköz jelenleg használt anyagtulajdonságainak lekéréséhez hívja meg a IDirect3DDevice9::GetMaterial metódust az eszközhöz. Az IDirect3DDevice9::SetMaterial metódustól eltérően IDirect3DDevice9::GetMaterial nem igényel előkészítést. A IDirect3DDevice9::GetMaterial metódus elfogadja egy D3DMATERIAL9 szerkezet címét, és a visszatérés előtt kitölti a megadott struktúrát az aktuális anyagtulajdonságokat leíró információkkal.
// For this example, the pd3dDev variable is assumed to
// be a valid pointer to an IDirect3DDevice9 interface.
HRESULT hr;
D3DMATERIAL9 mat;
hr = pd3dDev->GetMaterial(&mat);
if(FAILED(hr))
{
// Code to handle the error goes here.
}
Jegyzet
Ha az alkalmazás nem ad meg anyagtulajdonságokat a rendereléshez, a rendszer egy alapértelmezett anyagot használ. Az alapértelmezett anyag az összes diffúz fényt - például fehéret - tükrözi környezeti vagy spekuláris tükröződés nélkül, és nem engedékeny színt.
Kapcsolódó témakörök