Materiały (Direct3D 9)
Materiały opisują, jak wielokąty odbijają światło lub wydają się emitować światło w scenie 3D. Właściwości materiału szczegółowo odbicia rozproszonego materiału, odbicia otoczenia, emisji światła i cech wyróżnienia widmowego. Funkcja Direct3D używa struktury D3DMATERIAL9 do przenoszenia wszystkich informacji o właściwości materiału. Z wyjątkiem właściwości specular, każda właściwość jest opisana jako kolor RGBA, który reprezentuje, ile części czerwonego, zielonego i niebieskiego danego typu światła odzwierciedla, oraz współczynnik mieszany alfa.
Odbicie dyfuzora i otoczenia
Elementy dyfuzyjne i otoczenia struktury D3DMATERIAL9 opisują, w jaki sposób materiał odzwierciedla otoczenia i rozproszone światło na scenie. Ponieważ większość scen zawiera znacznie więcej światła dyfuzornego niż światło otoczenia, odbicie rozproszone odgrywa największą rolę w określaniu koloru. Ponadto, ponieważ rozproszone światło jest kierunkowe, kąt częstości występowania rozproszonego światła wpływa na ogólną intensywność odbicia. Odbicie rozproszone jest największe, gdy światło uderza wierzchołek równolegle do wierzchołka normalnego. Wraz ze wzrostem kąta efekt odbicia rozproszonego spada. Ilość światła odbitego jest cosinus kąta między światłem przychodzącym a normalnym wierzchołkami, jak pokazano na poniższej ilustracji.
Odbicie otoczenia, takie jak światło otoczenia, jest niekierunkowe. Odbicie otoczenia ma mniejszy wpływ na pozorny kolor renderowanego obiektu, ale ma wpływ na ogólny kolor i jest najbardziej zauważalny, gdy małe lub żadne rozproszone światło odbija się od materiału. Odbicie otoczenia materiału ma wpływ na zestaw światła otoczenia dla sceny przez wywołanie IDirect3DDevice9::SetRenderState metody z flagą D3DRS_AMBIENT.
Odbicie rozproszone i otoczenia współpracują ze sobą, aby określić postrzegany kolor obiektu i są zwykle identyczne. Na przykład aby renderować niebieski obiekt kryształowy, należy utworzyć materiał, który odzwierciedla tylko niebieski składnik rozproszonego i otoczenia światła. Po umieszczeniu w pokoju z białym światłem kryształ wydaje się być niebieski. Jednak w pokoju, który ma tylko czerwone światło, ten sam kryształ wydaje się być, ponieważ jego materiał nie odzwierciedla czerwonego światła.
Emisja
Materiały mogą służyć do tworzenia renderowanego obiektu wydają się być samoświetne. Element członkowski D3DMATERIAL9 struktury służy do opisywania koloru i przezroczystości emitowanego światła. Emisja wpływa na kolor obiektu i może, na przykład, uczynić ciemny materiał jaśniejszym i wziąć udział w emitowanych kolorach.
Możesz użyć właściwości emisisowej materiału, aby dodać iluzję, że obiekt emituje światło, bez ponoszenia narzut obliczeniowych na dodanie światła do sceny. W przypadku niebieskiego kryształu właściwość emisisive jest przydatna, jeśli chcesz, aby kryształ wydawał się świecić, ale nie rzucać światło na inne obiekty w scenie. Pamiętaj, że materiały z właściwościami emisisyjnymi nie emitują światła, które mogą być odzwierciedlone przez inne obiekty w scenie. Aby osiągnąć to światło odbite, należy umieścić dodatkowe światło w scenie.
Odbicie widmowe
Odbicie widmowe tworzy wyróżnienia na obiektach, dzięki czemu wydają się błyszczące. Struktura D3DMATERIAL9 zawiera dwa elementy członkowskie, które opisują kolor wyróżnienia widmowego, a także ogólną błyszczącość materiału. Określasz kolor wyróżniania widmowego, ustawiając element członkowski Specular na żądany kolor RGBA — najczęściej używane kolory to biały lub jasnoszary. Wartości ustawione w elemencie Członkowskim zasilania określają, jak ostre są efekty specularne.
Specular highlights może tworzyć dramatyczne efekty. Rysunek ponownie na niebieskiej analogii kryształowej: większa wartość Mocy tworzy ostrzejsze podkreślenie widmowe, dzięki czemu kryształ wydaje się być dość błyszczący. Mniejsze wartości zwiększają obszar efektu, tworząc nudne odbicie, które sprawiają, że kryształ wygląda mróz. Aby obiekt był naprawdę matowy, ustaw element członkowski zasilania na zero i kolor w specular na. Poeksperymentuj z różnymi poziomami odbicia, aby uzyskać realistyczny wygląd dla Twoich potrzeb. Na poniższej ilustracji przedstawiono dwa identyczne modele. Ten po lewej stronie wykorzystuje specularną moc odbicia 10; model po prawej stronie nie ma spektrularnego odbicia.
Ustawianie właściwości materiału
Urządzenia renderowania Direct3D mogą renderować jeden zestaw właściwości materiału naraz.
W aplikacji języka C++ ustawiasz właściwości materiału używane przez system, przygotowując strukturę D3DMATERIAL9, a następnie wywołując metodę IDirect3DDevice9::SetMaterial.
Aby przygotować strukturę D3DMATERIAL9 do użycia, ustaw informacje o właściwości w strukturze, aby utworzyć pożądany efekt podczas renderowania. Poniższy przykład kodu konfiguruje strukturę D3DMATERIAL9 dla fioletowego materiału z ostrymi białymi wyróżnieniami widmowymi.
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;
Po przygotowaniu struktury D3DMATERIAL9 należy zastosować właściwości, wywołując metodę IDirect3DDevice9::SetMaterial urządzenia renderowania. Ta metoda akceptuje adres przygotowanej struktury D3DMATERIAL9 jako jedyny parametr. Możesz wywołać IDirect3DDevice9::SetMaterial z nowymi informacjami w razie potrzeby, aby zaktualizować właściwości materiału dla urządzenia. Poniższy przykład kodu pokazuje, jak może to wyglądać w kodzie.
// 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.
}
Podczas tworzenia urządzenia Direct3D bieżący materiał jest automatycznie ustawiany na wartość domyślną pokazaną w poniższej tabeli.
Członek | Wartość |
---|---|
Rozproszonych | (R:0, G:0, B:0, A:0) |
Lustrzane | (R:0, G:0, B:0, A:0) |
Otaczający | (R:0, G:0, B:0, A:0) |
Emisisive | (R:0, G:0, B:0, A:0) |
Moc | (0.0) |
Pobieranie właściwości materiału
Pobierasz właściwości materiału używane obecnie przez urządzenie renderowania, wywołując metodę IDirect3DDevice9::GetMaterial dla urządzenia. W przeciwieństwie do metody IDirect3DDevice9::SetMaterial, IDirect3DDevice9::GetMaterial nie wymaga przygotowania. Metoda IDirect3DDevice9::GetMaterial akceptuje adres struktury D3DMATERIAL9 i wypełnia podaną strukturę informacjami opisującym bieżące właściwości materiału przed zwróceniem.
// 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.
}
Nuta
Jeśli aplikacja nie określa właściwości materiału do renderowania, system używa domyślnego materiału. Domyślny materiał odzwierciedla wszystkie rozproszone światło - białe, na przykład - bez otoczenia lub widmowego odbicia i bez koloru emisisyjnego.
Tematy pokrewne