8. Światła

Szczawik

1 Wstęp
2 Włączanie oświetlenia
3 Definiowanie świateł
4 Definiowanie materiałów
5 Kod źródłowy

Wstęp

Światło w scenie jest podstawowym elementem, pozwalającym obserwatorowi na widzenie obiektów, ale również wpływającym na realizm sceny. We wszystkich dotychczasowych przykładach założono model bezoświetleniowy, co oznacza, że bez potrzeby definiowania źródła światła, wszystkie obiekty były widoczne zgodnie z ustalonym kolorem lub teksturą.

Model oświetleniowy jest pod tym względem całkowicie odmienny. Wymaga określenia parametrów poszczególnych świateł oraz oświetlenia otoczenia (ambient), by prezentowane obiekty nie były zabarwione na kolor czarny.

d3dkurs8.jpg
Rys. 6. Okno aplikacji z trzema światłami punktowymi

W tym kroku kursu zostanie przybliżone renderowanie z użyciem oświetlenia punktowego. Zapraszam do samodzielnego wypróbowania innych typów oświetlenia.

Warto zaznaczyć, że widoczne na rys. 6. kolorowe punkty, reprezentujące światła, zostały dodatkowo wprowadzone do sceny, by przedstawić lokalizację oświetlenia; źródła światła, jako osobne obiekty, samodzielnie nie są widoczne.

Włączanie oświetlenia

Po rozpoczęciu renderowania należy ustawić stan urządzenia renderującego. Minimalne działanie w tym zakresie z punktu widzenia światła wymaga również określenia światła otoczenia.

device.RenderState.Lighting = true;
device.RenderState.Ambient = Color.Gray;

Tak skonfigurowana scena eksponowałaby wszystkie, znajdujące się w jej ramach, figury z kolorem stłumionym.

Definiowanie świateł

Wygodnym może być przeniesienie wszystkich instrukcji do oddzielnej metody, wywoływanej po device.BeginScene:

SetLight(time);

W prezentowanym przykładzie źródła światła poruszają się, więc niezbędnym jest też przekazanie zmiennej czasowej przy wywołaniu.

Metoda SetLight ma za zadanie włączenie oświetlenia oraz włączenie trzech świateł. Jej kod może mieć następującą postać:

private void SetLight(float time)
{
	device.RenderState.Lighting = true;

	device.Lights[0].Enabled = true;
	device.Lights[0].Type = LightType.Point;
	device.Lights[0].Range = 1.5f;
	device.Lights[0].Ambient = Color.Red;
	device.Lights[0].Attenuation1 = 3f;
	device.Lights[0].Position = new Vector3(
		1f, (float)Math.Sin(time/2000f), (float)Math.Cos(time/2000f));
			
	device.Lights[1].Enabled = true;
	device.Lights[1].Type = LightType.Point;
	device.Lights[1].Range = 1.5f;
	device.Lights[1].Ambient = Color.Green;
	device.Lights[1].Attenuation1 = 3f;
	device.Lights[1].Position = new Vector3(
		(float)Math.Sin(time/1000f), 1f, (float)Math.Cos(time/1000f));
			
	device.Lights[2].Enabled = true;
	device.Lights[2].Type = LightType.Point;
	device.Lights[2].Range = 1.5f;
	device.Lights[2].Ambient = Color.Blue;
	device.Lights[2].Attenuation1 = 3f;
	device.Lights[2].Position = new Vector3(
		(float)Math.Sin(time/3000f), (float)Math.Cos(time/3000f), 1f);
}

Jak pokazano powyżej, każde ze świateł opisane jest między innymi przez następujące parametry:

  • Enabled - włączenie,
  • Type - typ: punktowe (point), kierunkowe (directional), sceniczne (spot),
  • Position - wektor położenia źródła,
  • Range - zasięg,
  • Ambient - kolor podstawowy światła,
  • Attenuation1 - współczynnik tłumienia w ramach zasięgu.

Różne typy świateł mogą wymagać różnych parametrów. Po szczegóły odsyłam do dokumentacji DirectX SDK.

Warto również zaznaczyć, że istnieje ograniczenie maksymalnie do ośmiu świateł w jednym renderowaniu. Ograniczenie to dawniej rozwiązywano przez stosowanie przygotowanych tekstur z namalowanym oświetleniem lub kolorowanie wierzchołków, dokonywane przez procesor główny. Wraz z pojawieniem się mechanizmów cieniowania (shader), podejście to zostało całkowicie zmienione. Więcej szczegółów znajduje się w dziale HLSL.

Kalkulacja oświetlenia w sposób pokazany w niniejszym kroku kursu jest prosta w realizacji, ale - szczególnie przy kartach starszych - wymaga znacznej mocy obliczeniowej.

Definiowanie materiałów

Samo zdefiniowanie świateł nie jest wystarczające. Należy również opisać materiały, a więc sposób w jaki powierzchnie wielokątów sceny reagują na padające światło. O ile światła są ustalane dla przebiegu renderownia, tyle materiały mogą być ustawiane dla konkretnego zbioru wierzchołków, przez co w ramach sceny oświetlonej w wybrany sposób, różne obiekty mogą wyglądać różnie.

Minimalna definicja materiału może wyglądać następująco:

material = new Material();
material.Ambient = Color.White;
device.Material = material;

Zgodnie z nią, wierzchołki ma taki materiał, że przy naturalnym oświetleniu otoczenia są białe - nie wpływają zatem na nadaną teksturę. Ciemniejsze lub kolorowe wierzchołki powodują zaciemnienie lub kolorowanie obrazu tekstury.

Dostępne kolory w ramach materiału to:

  • Ambient - kolor podstawowy,
  • Diffuse - kolor dodatkowy (rozmycia),
  • Specular - kolor połysku,
  • Emissive - kolor emitowanego światła.

Kod źródłowy

Całość kodu źródłowego projektu: d3dkurs8.zip

2 komentarzy

Może coś o overlay w Delphi!!!