background image

Laboratorium nr 6 

1/7 

 

1) 

Wprowadzenie 

 

Specyfikacja  biblioteki  OpenGL  rozróżnia  trzy  niezależne  rodzaje  światła:  

ś

wiatło  otoczenia (ambient  light),  światło  rozproszone  (diffuse  light)  oraz  światło  odbite 

(specular  light).  Każdy  komponent  światła  definiowany  jest  przez  cztery  wartości  RGBA, 

określające 

względną 

intensywność 

czerwonego, 

zielonego, 

niebieskiego 

oraz  

składowej alfa. 

 

Ś

wiatło  otoczenia  jest  to  najprostszy  typ  światła.  Rozprasza  się  równomiernie  na 

powierzchni  danego  obiektu  niezależnie  od  swojego  źródła.  Odbija  się  od  obiektów 

znajdujących się w jego zasięgu, rozjaśniając wszystkie obiekty znajdujące się dookoła. 

 

 

 

Ś

wiatło  rozproszone  w  przeciwieństwie  do  światła  otoczenia  posiada  kierunek. 

Oznacza  to,  że  gdy  oświetlamy  światłem  rozproszonym  jedną  ze  stron  danego  obiektu  to 

tylko ta strona jest oświetlona, a pozostałe nie. Światło rozproszone rozprowadzane jest na 

powierzchni obiektu w sposób równomierny. 

 

 

 

 

 

Grafika Komputerowa 3D 

Temat: Materiały i oświetlenie 

 

Instrukcja 

laboratoryjna 

Przygotował: mgr inż. Maciej Lasota 

background image

Laboratorium nr 6 

2/7 

 

 

 

Ś

wiatło odbite również posiada określony kierunek, ale jest odbijane na powierzchni 

obiektu  w  konkretnym  kierunku.  Takie  typ  światła  powoduje,  że  na  powierzchni  obiektu 

pojawia się rozbłysk (zazwyczaj o kolorze białym). 

 

 

 

1.1)  Wektory normalne 

 

Aby  w  OpenGL  oświetlenie  było  obliczanie  poprawnie,  każdej  ścianie  należy 

przypisać wektor normalny. Służą do tego celu funkcje z rodziny glNormal

 

void glNormal3f(GLfloat x, GLfloat y, GLfloat z) 

void glNormal3d(GLdouble x, GLdouble y, GLdouble z) 

 

Funkcje  te  definiują  wektor  normalny  dla  powierzchni.  Przyjmują  trzy  parametry 

będące  współrzędnymi  wektora  normalnego.  Wektor  ten  powinien  być  jednostkowy 

(znormalizowany). 

 

background image

Laboratorium nr 6 

3/7 

 

2) 

Materiały 

 

Materiały  określają  kolor  dla  obiektu,  na  który  pada  światło.  W  OpenGL  każdy 

materiał  pokrywający  zdefiniowany  obiekt  ma  określone  właściwości  odbicia  światła 

otaczającego,  rozproszonego  i  odbitego.  Barwa  obiektu  widzianego  przez  obserwatora 

zależy  od  rodzaju  światła  padającego  na  obiekt  i  materiału,  z  jakiego  jest  wykonany. 

Podobnie  jak  światło, materiał  również  można  opisać  za  pomocą  współczynników  ambient

diffuse  i  specular,  które  w  tym  wypadku  oznaczają  procentową  zdolność  materiału  do 

absorbowania i odbijania światła. Za przypisywanie obiektom materiałów odpowiada rodzina 

funkcji glMaterial

 

void glMaterialf(GLenum face, GLenum pname, GLfloat param) 

void glMateriald(GLenum face, GLenum pname, GLdouble param) 

void glMateriali(GLenum face, GLenum pname, GLint param) 

 

Funkcje z rodziny glMaterial przyjmują trzy parametry. Pierwszy parametr określa, czy 

definiujemy  materiał  dla  przednich,  tylnych,  czy  obydwu  stron  wielokątów.  Drugi  parametr 

określa  jaką  właściwość  materiału  definiujemy.  Ostatni  parametr  to  tablica  wartości 

składających się na kolor RGB lub pojedyncza wartość. 

 

Parametr „face” 

Opis 

GL_FRONT 

Przednia strona wielokąta 

GL_BACK 

Tylna strona wielokąta 

GL_FRONT_AND_BACK 

Przednia i tylna strona wielokąta 

 

Parametr „pname” 

Opis 

GL_AMBIENT 

Definiujemy kolor materiału dla światła otoczenia 

GL_DIFFUSE 

Definiujemy kolor materiału dla światła rozproszonego 

GL_SPECULAR 

Definiujemy kolor materiału dla światła odbitego 

GL_AMBIENT_AND_DIFFUSE 

Definiujemy kolor materiału dla światła otoczenia i rozproszonego 

GL_SHININESS 

Definiujemy kolor materiału z możliwością zmiany mocy światła 

odbitego. Jako ostatni parametr funkcji glMaterial podajmy liczbę z 

przedziału (0 – 128) określającą moc odbicia 

GL_EMISSION 

Definiujemy kolor materiału z efektem emisji, który jest dodawany 

do wynikowego koloru obiektu. 

 

 

 

 

background image

Laboratorium nr 6 

4/7 

 

2.1)  Śledzenie materiału 

 

Ś

ledzenie  materiału  umożliwia  nam  zmianę  koloru  danego  typu  materiału  z 

wykorzystaniem  funkcji  glColor.  Możemy  np.  śledzić  kolor  światła  otoczenia,  każdorazowa 

zmiana  koloru  funkcją  glColor  spowoduje  zmianę  koloru  materiału  dla  światła  otoczenia. 

Włączenie  śledzenia  materiału  dokonujemy  za  pomocą  funkcji  glEnable  z  parametrem 

GL_COLOR_MATERIAL

Przypisanie  śledzonego  koloru  materiału  funkcji  glColor,  odbywa  się  za  pomocą 

funkcji glColorMaterial.  

 

void glColorMaterial(GLenum face, GLenum mode) 

 

Funkcja  ta  przyjmuje  dwa  parametry.  Pierwszy  parametr  określa  strony  wielokątów 

których  będzie  dotyczyć  śledzony  kolor.  Drugi  parametr  określa  materiał,  jaki  będzie 

ś

ledzony. 

 

Parametr „face” 

Opis 

GL_FRONT 

Przednia strona wielokąta 

GL_BACK 

Tylna strona wielokąta 

GL_FRONT_AND_BACK 

Przednia i tylna strona wielokąta 

 

Parametr „mode” 

GL_AMBIENT

 

GL_DIFFUSE

 

GL_SPECULAR

 

GL_AMBIENT_AND_DIFFUSE

 

GL_EMISSION

 

 

 

Najczęściej podaje się GL_FRONT_AND_BACK jako pierwszy parametr oraz 

GL_AMBIENT_AND_DIFFUSE jako drugi. 

 

 

 

 

 

 

 

background image

Laboratorium nr 6 

5/7 

 

3) 

Oświetlenie 

 

Aby włączyć oświetlenie w OpenGL należy wywołać funkcję glEnable z parametrem 

GL_LIGHTING.  Funkcja  ta  nakazuje  bibliotece,  aby  przy  obliczaniu  koloru  wierzchołków  w 

scenie  brała  pod  uwagę  właściwości  materiału  i  parametry  oświetlenia.  W  OpenGL 

dostępnych jest osiem niezależnych źródeł światła. Każdemu z nich możemy przypisać inne 

położenie, kolor otoczenia czy rozproszenia oraz kilka innych parametrów. Funkcją służącą 

do ustawiania i modyfikacji parametrów oświetlenia jest glLight

 

void glLightf(GLenum light, GLenum pname, GLfloat param) 

void glLighti(GLenum light, GLenum pname, GLint param) 

 

Funkcja  ta  przyjmuje  trzy  parametry.  Pierwszy  parametr  określa  którego  światła 

parametry modyfikujemy.  Drugi  parametr  określa, który  parametr  światła  zmieniamy.  Trzeci 

parametr określa kolor lub pojedynczą wartość przypisywaną danej właściwości. 

 

Parametr „light” 

Opis 

GL_LIGHTx 

Parametr określa, którego światła parametry modyfikujemy 

x – jest to liczba z przedziału <0,7>, 0 < x < GL_MAX_LIGHTS 

np. GL_LIGHT1, GL_LIGHT2, … 

 

Parametr „pname” 

GL_AMBIENT

 

GL_DIFFUSE

 

GL_SPECULAR

 

 

UWAGA!!! Za pomocą funkcji glEnable oraz glDisable, możemy włączać i wyłączać 

konkretne światło podając jako parametr np. GL_LIGHT1, GL_LIGHT2 itd. 

 

3.1)  Pozycja światła 

 

Konkretnemu światłu możemy przypisać położenie, które określa z której strony pada. 

Aby  zdefiniować  położenie  światła  jako  drugi  parametr  „pname”  funkcji  glLight  podajemy 

stałą GL_POSITION. Jako trzeci parametr przekazujemy wtedy czteroelementowy wektor.  

 

Parametr „pname” 

GL_POSITION

 

 

background image

Laboratorium nr 6 

6/7 

 

3.2)  Reflektor 

 

Reflektor  jest  to  specjalny  typ  światła,  który  oświetla  obiekt  w  danym  konkretnym 

miejscu np. latarka. 

 

Parametr „pname” 

Opis 

GL_SPOT_CUTOFF 

Definiujemy rozpiętość stożka widzenia w stopniach,  

domyślnie jest 180 stopni 

GL_SPOT_DIRECTION 

Określamy wektor kierunku 

GL_SPOT_EXPONENT 

Definiujemy płynne przejście od miejsc najbardziej do najmniej 

oświetlonych 

 

3.3)  Tłumienie światła 

 

Tłumienie  powoduje,  że  obiekty  bardziej  oddalone  od  źródła  światła  są  mniej 

oświetlone,  a  w  konsekwencji  mogą  nie  być  oświetlone  w  ogóle  jeśli  znajdują  się 

odpowiednio daleko. Tłumienie ustawiamy za pośrednictwem trzech stałych: 

 

GL_CONSTANT_ATTENUATION 

GL_LINEAR_ATTENUATION 

GL_QUADRATIC_ATTENUATION 

 

W zależności od tego jakie przyjmują one wartości otrzymujemy odpowiednie efekty 

tłumienia. 

 

Parametr „pname” 

Opis 

Efekty 

GL_CONSTANT_ATTENUATION 

Wartość wynosi 1.0 

GL_LINEAR_ATTENUATION 

Wartość wynosi 0.0 

GL_QUADRATIC_ATTENUATION 

Wartość wynosi 0.0 

Wraz z odległością wierzchołki 

oświetlane są tak samo 

 

Parametr „pname” 

Opis 

Efekty 

GL_CONSTANT_ATTENUATION 

Wartość wynosi 0.0 

GL_LINEAR_ATTENUATION 

Wartość wynosi 1.0 

GL_QUADRATIC_ATTENUATION 

Wartość wynosi 0.0 

Zanik liniowy 

 

Parametr „pname” 

Opis 

Efekty 

GL_CONSTANT_ATTENUATION 

Wartość wynosi 0.0 

GL_LINEAR_ATTENUATION 

Wartość wynosi 0.0 

GL_QUADRATIC_ATTENUATION 

Wartość wynosi 1.0 

Zanik kwadratowy 

 

 

background image

Laboratorium nr 6 

7/7 

 

3.4)  Modyfikacja oświetlenia globalnego 

 

W OpenGL istnieje możliwość modyfikacji oświetlenia globalnego. Do tego celu służy 

rodzina funkcji glLightModel. 

 

void glLightModelf(GLenum pname, GLfloat param) 

void glLightModeli(GLenum pname, GLint param) 

 

Funkcje  te  przyjmują  dwa  parametry.  Pierwszy  parametr  określa  jaką  właściwość 

modelu oświetlenia zmieniamy: 

 

GL_LIGHT_MODEL_LOCAL_VIEWER 

GL_LIGHT_MODEL_TWO_SIDE 

GL_LIGHT_MODEL_AMBIENT 

 

Drugi parametr określa przypisywaną wartość.