to get the file
Transkrypt
to get the file
Laboratorium nr 6 Instrukcja laboratoryjna 6 1) 1/7 Grafika Komputerowa 3D Temat: Materiały i oświetlenie Przygotował: mgr inż. Maciej Lasota 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. 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). Laboratorium nr 6 2) 3/7 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 GL_EMISSION 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 Definiujemy kolor materiału z efektem emisji, który jest dodawany do wynikowego koloru obiektu. Laboratorium nr 6 2.1) 4/7 Ś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. Laboratorium nr 6 3) 5/7 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 Laboratorium nr 6 3.2) 6/7 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 GL_LINEAR_ATTENUATION GL_QUADRATIC_ATTENUATION Wartość wynosi 1.0 Wartość wynosi 0.0 Wartość wynosi 0.0 Wraz z odległością wierzchołki oświetlane są tak samo Parametr „pname” Opis Efekty GL_CONSTANT_ATTENUATION GL_LINEAR_ATTENUATION GL_QUADRATIC_ATTENUATION Wartość wynosi 0.0 Wartość wynosi 1.0 Wartość wynosi 0.0 Zanik liniowy Parametr „pname” Opis Efekty GL_CONSTANT_ATTENUATION GL_LINEAR_ATTENUATION GL_QUADRATIC_ATTENUATION Wartość wynosi 0.0 Wartość wynosi 0.0 Wartość wynosi 1.0 Zanik kwadratowy Laboratorium nr 6 3.4) 7/7 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ść.