Temat: Materiały i oświetlenie 1 Wstęp teoretyczny
Transkrypt
Temat: Materiały i oświetlenie 1 Wstęp teoretyczny
Grafika komputerowa 3D Instrukcja laboratoryjna 12 Temat: Materiały i oświetlenie Przygotował: dr inż. Grzegorz Łukawski, mgr inż. Maciej Lasota, mgr inż. Tomasz Michno 1 Wstęp teoretyczny 1.1 Rodzaje światła Grafika 3D bez obsługi oświetlenia sprawia zazwyczaj wrażenie bardzo nierealistycznej. Z tego względu wszystkie (lub prawie wszystkie) biblioteki implementują różne rodzaje światła. W OpenGLu dostępne są 3 rodzaje: światło otoczenia (ambient light), światło rozproszone (diffuse light) oraz światło odbite (specular light). Światło otoczenia – światło o niezmiennej jasności i kolorze, które oświetla każdy obiekt na scenie równomiernie (oświetla obiekt z każdego kierunku równomiernie). Światło rozproszone – światło o ustalonym kierunku, co powoduje że obiekty są oświetlane tylko z jednej strony. Światło rozproszone jest rozprowadzane na danej ścianie obiektu równomiernie. 1/8 Światło odbite – światło o ustalonym kierunku, odbijające się od obiektu również w ustalonym kierunku, który będąc pod odpowiednim kątem do obserwatora powoduje pojawienie się rozbłysku. 1.2 Wektory normalne Każda ściana obiektu, w przypadku gdy chcemy używać oświetlenia, powinna posiadać wektory normalne (wektory prostopadłe do powierzchni). W tym celu należy użyć jednej z funkcji: 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). W przypadku gdy stosujemy obiekty GLUTa (teapot itp.), nie ma potrzeby podawania wektorów normalnych, ponieważ są one już zdefiniowane w kodzie biblioteki. 1.3 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) 2/8 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. 1.4 Ś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 3/8 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” 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. Najczęściej podaje się GL_FRONT_AND_BACK jako pierwszy parametr oraz GL_AMBIENT_AND_DIFFUSE jako drugi. 1.5 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 4/8 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. 1.6 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. 1.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 5/8 Definiujemy płynne przejście od miejsc najbardziej do najmniej oświetlonych GL_SPOT_EXPONENT 1.8 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 GL_CONSTANT_ATTENUATION Wartość wynosi 1.0 GL_LINEAR_ATTENUATION Wartość wynosi 0.0 GL_QUADRATIC_ATTENUATION Wartość wynosi 0.0 Parametr „pname” Opis GL_CONSTANT_ATTENUATION Wartość wynosi 0.0 GL_LINEAR_ATTENUATION Wartość wynosi 1.0 GL_QUADRATIC_ATTENUATION Wartość wynosi 0.0 Parametr „pname” Opis GL_CONSTANT_ATTENUATION Wartość wynosi 0.0 GL_LINEAR_ATTENUATION Wartość wynosi 0.0 GL_QUADRATIC_ATTENUATION Wartość wynosi 1.0 Efekty Wraz z odległością wierzchołki oświetlane są tak samo Efekty Zanik liniowy Efekty Zanik kwadratowy 1.9 Modyfikacja oświetlenia globalnego W OpenGL istnieje możliwość modyfikacji oświetlenia globalnego. Do tego celu służy rodzina funkcji glLightModel. 6/8 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ść. 1.10 Stos macierzy przekształceń Czasami podczas wykonywania przekształceń może nastąpić potrzeba zapamiętania aktualnego stanu macierzy (zazwyczaj gdy chcemy przekształcić dodatkowo część obiektów, a część pozostawić bez zmian). W tym celu należy użyć funkcji: glPushMatrix() Do ponownego wczytania stanu macierzy służy funkcja: glPopMatrix() Stany macierzy zapamiętywane są na stosie, dzięki czemu możliwe jest zapamiętanie wielu stanów, a następnie ich wczytywanie w tej samej kolejności. 1.11 Zapamiętanie atrybutów oświetlenia Podobnie jak przy przekształceniach, dla oświetlenia również może wystąpić potrzeba zapamiętania jego atrybutów. Często zachodzi taka potrzeba gdy chcemy chwilowo wyłączyć oświetlenie i np. narysować tekst. Zapamiętanie wszystkich atrybutów oświetlenia realizowane jest przez funkcję: glPushAttrib(GL_LIGHTING_BIT); Ponowne wczytanie atrybutów: glPopAttrib(); Podobnie jak dla macierzy przekształceń, atrybuty odkładane są na stos. 7/8 2 Zadanie Stwórz program, w którym narysujesz kilka obiektów, z których wszystkie za wyjątkiem jednego będą oświetlone. Oświetlenie powinno składać się ze wszystkich 3 rodzajów światła, powinno być również przesuwane automatycznie lub za pomocą klawiatury. Nieoświetlony obiekt należy narysować wykorzystując zapamiętywanie atrybutów oświetlenia. 8/8