GLfloat param_materialu1[5][4] = {
{ 1.0, 1.0, 0.0, 1.0}, //
wspolczynnik odbicia swiatla otoczenia
{1.0, 1.0, 0.0, 1.0}, // [1] wspolczynnik odbicia swiatla rozproszonego
{1.0, 1.0, 1.0, 1.0}, // [2] wspolczynnik odbicia swiatla lustrzanego
{20.0, 0.0, 0.0, 0.0}, // [3] polysk
{0.0, 0.0, 0.0, 1.0}}; // [4] kolor swiatla emitowanego
Wartości które odpowiadają za kolor materiału są umieszczone we współczynnikach
odbicia światła otoczenia, światła rozproszonego i światła lustrzanego. Aby nasz
materiał się błyszczał ustawiamy pierwszą wartość połysku na 20.
3. Właściwości materiału nr 2: czerwony matowy (widziany w białym świetle),
Materiał czerwony matowy uzyskujemy w podobny sposób, definiującą wartości
połysku i poszczególnych współczynników światła w odpowiedni sposób, co się
przedstawia następująco:
GLfloat param_materialu2[5][4] = {
{1.0, 0.0, 0.0, 1.0}, //
wspolczynnik odbicia swiatla otoczenia
{1.0, 0.0, 0.0, 1.0}, // [1] wspolczynnik odbicia swiatla rozproszonego
{0.0, 0.0, 0.0, 1.0}, // [2] wspolczynnik odbicia swiatla lustrzanego
{0.0, 0.0, 0.0, 0.0}, // [3] polysk
{0.0, 0.0, 0.0, 1.0}}; // [4] kolor swiatla emitowanego
Następnie definiujemy właściwości poszczególnych źródeł światła. Zgodnie z
treścią zadania dla źródła nr 1 pierwsze trzy wiersze naszej tablicy ustawiamy dla
koloru białego na wartość 1, dzięki czemu otrzymujemy natężenie równe 1. jest to
światło reflektora w którym kąt odcięcia jest równy 25 stopni, więc taką wartość
ustawiamy w wierszu szóstym, co przedstawia sie następująco:
GLfloat param_swiatla1[10][4] = {
{1.0, 1.0, 1.0, 1.0}, //
otoczenie
{1.0, 1.0, 1.0, 1.0}, // [1] rozproszenie
{1.0, 1.0, 1.0, 1.0}, // [2] lustrzane
{5.0, 0.0, 0.0, 1.0}, // [3] polozenie
{-1.0, 0.0, 0.0, 0.0}, // [4] kierunek swiecenia
{0.0, 0.0, 0.0, 0.0}, // [5] tlumienie katowe swiatla
{ 25.0, 0.0, 0.0, 0.0}, // [6] kat odciecia swiatla
{2.0, 2.0, 2.0, 0.0}, // [7] stale tlumienie
{0.0, 0.0, 0.0, 0.0}, // [8] tlumienie liniowe
{0.0, 0.0, 0.0, 0.0}}; // [9] tlumienie kwadratowe
Parametry źródła drugiego światła ustawiamy w analogiczny sposób. Należy
pamiętać, że jest to światło kierunkowe gdzie nie ma zdefiniowanego kąta odcięcia
więc ustawiamy go na 180 stopni, aby oświetlał po całym swoim zasięgu z położenia
w punkcie P(10,10,10), które również musimy ustawić w wierszu trzecim. Co
przedstawia się następująco:
GLfloat param_swiatla2[10][4] = {
{0.8, 0.0, 0.8, 1.0}, //
otoczenie
{0.8, 0.0, 0.8, 1.0}, // [1] rozproszenie
{0.8, 0.0, 0.8, 1.0}, // [2] lustrzane
{1.0, 1.0, 1.0, 0.0},// [3] polozenie
{-1.0, -1.0, -1.0, 0.0},// [4] kierunek swiecenia
{0.0, 0.0, 0.0, 0.0}, // [5] tlumienie katowe swiatla
{180.0, 0.0, 0.0, 0.0}, // [6] kat odciecia swiatla
{0.0, 0.0, 0.0, 0.0}, // [7] stale tlumienie
{0.0, 0.0, 0.0, 0.0}, // [8] tlumienie liniowe
{0.0, 0.0, 0.0, 0.0}}; // [9] tlumienie kwadratowe
Kolejnym krokiem jest skopiowanie macierzy parametrów do macierzy globalnych
Aby można ich było używać poza tą funkcją, co jest opisane w kodzie programu.
Kiedy zdefiniowaniu właściwości materiałów i świateł należy je włączyć. Ponieważ
mamy dwa źródła światła, więc tworzymy obsługę tych świateł. Aby włączyć światło
należy użyć polecenia:
glEnable(GL_LIGHT0);
glLightfv(GL_LIGHT0, GL_AMBIENT, swiatlo1[0]);
W pierwszej linijce włączamy oświetlenie danego źródła, natomiast w drugiej linijce
definiujemy jaki rodzaj światła włączamy dla danego źródła.
W analogiczny sposób robimy z materiałem, podajemy jaki rodzaj materiału ma być
włączony. Używamy do tego polecenia:
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, material1[0]);
Teraz chciałbym omówić ogólnie parametry definiowanego materiału.
void DefiniujMaterial1(void)
{
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, material1[0]);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, material1[1]);
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, material1[2]);
glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, material1[3]);
glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, material1[4]);
}
Parametr GL_FRONT_AND_BACK oznacza, że chcemy oświetlać obie strony
materiału.
Parametr GL_AMBIENT oznacza składowe RGBA, określające stopień odbicia
światła otaczającego.
GL_DIFFUSE - składowe RGBA określające stopień rozproszenia światła
rozproszonego,
GL_SPECULAR - składowe RGBA określające stopień odbicia światła odbitego,
GL SHININESS - określa wykładnik odbłysku światła, czyli regulacje stopnia
występowania efektu rozbłysku obiektu,
GL_EMISSION - składowe RGBA światła emitowanego przez obiekt, ale nie oświetla
innych obiektów.
Ogólne parametry definiowania światła (funkcja włączająca źródło światła):
glEnable(GL_LIGHT0);
glLightfv(GL_LIGHT0, GL_AMBIENT, swiatlo1[0]);
glLightfv(GL_LIGHT0, GL_DIFFUSE, swiatlo1[1]);
glLightfv(GL_LIGHT0, GL_SPECULAR, swiatlo1[2]);
glLightfv(GL_LIGHT0, GL_POSITION, swiatlo1[3]);
glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, swiatlo1[4]);
glLightf(GL_LIGHT0, GL_SPOT_EXPONENT, swiatlo1[5][0]);
glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, swiatlo1[6][0]);
glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, swiatlo1[7][0]);
glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, swiatlo1[8][0]);
glLightf(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, swiatlo1[9][0]);
Przy opisywaniu materiału omówiłęm już nie które z wyżej wymienionych instrukcji,
dlatego teraz opisze pozostałe:
GL_POSITION – określa położenie źródła światła, lub kierunek świecenia,
GL_SPOT DIRECTION - znormalizowany (długości 1) trój-współrzędny wektor
określający kierunek reflektora,
GL_SPOT EXPONENT - wykładnik tłumienia kątowego reflektora; GL SPOT
CUTOFF - kąt odcięcia reflektora;
GL CONSTANT_ATTENUATION - stały współczynnik tłumienia swiatła,
GL_LINEAR ATTENUATION - liniowy współczynnik tłumienia światła,
GL_QUADRATIC ATTENUATION - kwadratowy współczynnik tłumienia światła.