390 likes | 597 Views
Oświetlenie w OpenGL. Rozwiązanie dla OpenGL 2.1. Używane funkcje. Funkcja, która definiuje atrybuty źródła światła ( glLight ) Funkcje, które definiują charakter i parametry odbicia światła od powierzchni ( glMaterial , glColorMaterial ) Przełączniki glEnable / glDisable
E N D
Oświetlenie w OpenGL Rozwiązanie dla OpenGL 2.1
Używane funkcje • Funkcja, która definiuje atrybuty źródła światła (glLight) • Funkcje, które definiują charakter i parametry odbicia światła od powierzchni (glMaterial , glColorMaterial) • Przełączniki glEnable/glDisable • Wektory normalne (glNormal)
Światło w OpenGL Funkcja glLight określa właściwości źródła światła void glLight{if}[v](GLenumlight, GLenumpname,TYPE param); light: GL_LIGHT0,..., GL_LIGHT7 pname: Oświetlenie i cieniowanie
Uwagi do parametrówfunkcji glLight GL_POSITION: gdy w=0 – światłokierunkoweświecące w kierunku (-x, -y, -z)gdy w0 – światłopunktoweumieszczone w (x/w, y/w, z/w) GL_SPOT_CUTOFF: połowakątarozwarciastożka z przedziału [0.0, 90.0] plus wartośćspecjalna (zresztą domyślna)180.0 (oświetleniedookoła) GL_SPOT_DIRECTION: kierunek padania światła GL_SPOT_EXPONENT: określa stopień tłumienia kątowego w kierunku brzegu stożka światła, w oświetleniu kierunkowym, wg. zależności (na następnym slajdzie): Oświetlenie i cieniowanie
Parametry funkcji glLight, c.d. Intensywność oświetlenia = gdzie: v - wektorjednostkowyodźródłaświatła do oświetlanegowierzchołkad - kierunekpadaniaświatła (określony przez GL_SPOT_DIRECTION ) wartość GL_SPOT_EXPONENT=0oznaczabraktłumieniakątowego. Im większa wartość GL_SPOT_EXPONENT tym większe tłumienie ku brzegom stożka światła Attenuation factorf:(osłabienie oświetlenia punktowego w funkcji odległości d )
Wybórmodeluoświetlenia void glLightModelf(Glenumpname,GLfloatparam); void glLightModeli(Glenumpname,GLintparam); void glLightModelfv(Glenumpname,GLfloat*param); void glLightModeliv(Glenumpname,GLint*param); pname: Oświetlenie i cieniowanie
Wybór modelu oświetlenia, cd. • GL_LIGHT_MODEL_LOCAL_VIEWER: wpływa na postrzeganie odblasków przez obserwatora ; • gdyparametr jest różny od 0, kierunek patrzenia obserwatora jest obliczany dokładnie: od położenia obserwatorado oświetlanegowierzchołka; • gdyrówny 0 –zakładasię, żeobserwator jest umieszczony w nieskończonejodległości i na wszystkie wierzchołki patrzy po jednakowym kątem. • GL_LIGHT_MODEL_TWO_SIDE: • gdyrówny0 – tylkoprzedniepowierzchniesąoświetlane; w przeciwnymrazieprzednieitylne. • GL_LIGHT_MODEL_AMBIENT: podanewartości RGBA określająintensywnośćświatłaotoczeniadlacałejsceny. • GL_LIGHTMODEL_COLOR_CONTROL: • określa, czy oświetlenie światłem odbitym jest nakładane po nałożeniu tekstury (wtedy wartość parametru wynosi GL_SEPARATE_SPECULAR_COLOR), czy też razem z teksturą (GL_SINGLE_COLOR). Od wersji OpenGL 1.2
Włączenieoświetlenia i włączenie źródła światła glEnable(GL_LIGHTING)zezwolenienawykonanieobliczeńzwiązanychz oświetleniem glEnable(GL_LIGHTx)oddzielnewłączenieświatła x (wyłączenie: glDisable(GL_LIGHTING)) Każdeźródłoświatłamożeokreślaćtrzyrodzajeświatła: GLfloatyellow_ambient[] = { 0.2, 0.2, 0.0, 1.0 };GLfloatyellow_diffuse[] = { 1.0, 1.0, 0.0, 1.0 };GLfloatyellow_specular[] = { 1.0, 1.0, 0.0, 1.0 };GLfloatyellow_position[] = { 1.0, 1.0, 1.0, 0.0 }; glLightfv( GL_LIGHT0, GL_AMBIENT, yellow_ambient);glLightfv( GL_LIGHT0, GL_DIFFUSE, yellow_diffuse);glLightfv( GL_LIGHT0, GL_SPECULAR, yellow_specular);glLightfv( GL_LIGHT0, GL_POSITION, yellow_position); Oświetlenie i cieniowanie
Parametrymateriałowe void glMaterialfv(face, pname,value); face: GL_FRONT | GL_BACK | GL_FRONT_AND_BACK pname: Oświetlenie i cieniowanie
Zmianawłasnościmateriału Zamiast funkcji glMaterial używamy glColorMaterial. FunkcjaglColorMaterialokreśla, którewłasnościmateriałuidlaktórejpowierzchnimająprzyjąćustawieniabieżącegokoloru. void glColorMaterial{if}(GLenumface, GLenumpname); face: GL_FRONT | GL_BACK | GL_FRONT_AND_BACK pname: GL_AMBIENT | GL_DIFFUSE |GL_AMBIENT_AND_DIFFUSE| GL_SPECULAR | GL_EMISSION glEnable(GL_COLOR_MATERIAL)włącza co trzeba Oświetlenie i cieniowanie
Przykładużycia glEnable(GL_LIGHTING);glEnable(GL_COLOR_MATERIAL);glEnable(GL_LIGHT0);// Światłobiałe, połyskliweconst GLfloat white[4] = {1.f, 1.f, 1.f, 1.f};glMaterialfv( GL_FRONT, GL_SPECULAR, white);glMaterialf (GL_FRONT, GL_SHININESS, 20.f);glColor3f (.1f, .1f, .1f); Oświetlenie i cieniowanie
Schemat obliczeń bez oświetlenia i z oświetleniem Is OpenGL lighting enabled? glEnable(GL_LIGHTING);glDisable(GL_LIGHTING); nie tak Final polygon color is determinedby glColor( ); Are color-driven materials enabled? glEnable(GL_COLOR_MATERIAL);glDisable(GL_COLOR_MATERIAL); nie tak Final polygon colors for Ambient, DiffusedSpecular and Emission components are determined by glMaterial( ); Which color components are set by glColor( ) and which by glMaterial( )? glColorMaterial(...); Final polygon colors for components specified by glColorMaterials( );are set by glColor( ); The remaining components are set by glMaterial( );
Interpolacjaoświetlenia (shading) Problemy z tłumaczeniempojęć: shadowingishading. Definicja: shading jest określeniemmetodydeterminującejjasnośćibarwępunktunapowierzchni. Polskitermin, cieniowanie, należyrozumiećjakocieniowanierysunku (czylinakładaniejaśniejszych I cimniejszychplam), a nierzucaniecienia. Oświetlenie i cieniowanie
Cieniowanielokalne • Mówimy o modelucieniowanialokalnegogdyobiektynascenietraktowanesąlokalnie, to znaczyjedenobiektnieuwzględniapozostałych, zwłaszcza w aspekciewzajemnychodbićświatła. • Stosujemy je, gdyżsąszybkieiproste w obliczeniach. Niedająjednakwrażeniapełnegorealizmusceny. • Modelelokalneniewymagająwiedzy o całejscenie, a jedynie o bieżącymfragmenciepowierzchni. Oświetlenie i cieniowanie
Podstawowemodelecieniowanialokalnego Cieniowanie stałą wartością (flat shading) Cieniowanie z interpolacją jasności i barwy (Gouraud shading) Cieniowanie z interpolacją wektora normalnego (Phong interpolation) Oświetlenie i cieniowanie
Cieniowaniestałąwartością Każdy wielokąt oświetlony jest ze stałą intensywnością i barwą na całej swojej powierzchni. Oświetlenie i cieniowanie
Cieniowaniestałąwartością • Kiedy jest uzasadnione? • Gdy rysowane wielokąty przedstawiają rzeczywistą powierzchnię obiektu (np. wielościanu), a nie są aproksymacją powierzchni krzywoliniowej. • Gdy źródło światła jest w nieskończoności; wtedy N·L można przyjąć za stałe dla całej powierzchni wielokąta. • Gdy obserwator jest w nieskończoności; wtedy N·V można przyjąć za stałe dla całej powierzchni wielokąta. Oświetlenie i cieniowanie
Cieniowaniestałąwartością Realizacja w OpenGL: glShadeModel( GL_FLAT ); Alternatywnie można uruchomić wygładzanie Gourauda glShadeModel( GL_SMOOTH ); Oświetlenie i cieniowanie
InterpolacjaGourauda Dygresja. Przeciwnym podejściem w stosunku do ustalania stałej barwy/jasności dla całego wielokąta jest wyliczanie oświetlenia dla każdego punktu oddzielnie.Jest to jednak kosztowne obliczeniowo i niejasne – co to znaczy „każdy punkt” Rozwiązanie pośrednie: liniowa interpolacja jasności i barwy. Pionierskie prace z tego zakresu:Wylie, Romney, Evans, Erdahl: „Halftone Perspective Drawings by Computer”, FJCC 67, Thompson Books, Washington DC, 1967, 49-58. Gouraud, H. „Continuous Shading of Curved Surfaces”, IEEE Trans. On Computers, C-20(6), June 1971, 623-629. Oświetlenie i cieniowanie
InterpolacjaGourauda Interpolacja jasności/barwy odbywa się na podstawie wartości wyznaczonych w wierzchołkach wielokątów. Musimy więc znać wartości normalnych w tych wierzchołkach. Jak to policzyć? Oświetlenie i cieniowanie
InterpolacjaGourauda Oświetlenie i cieniowanie
InterpolacjaGourauda - efekty Oświetlenie i cieniowanie
InerpolacjaGourauda– zaletyiwady • Zalety: • Stosunkowo szybkie obliczenia • Skuteczne wygładzanie krawędzi Wady: • Krawędzie wygładzane są również tam, gdzie jest to niepożądane • Metoda zasadniczo nie oblicza odblasków, a jeśli wprowadza się je w sposób sztuczny, to są one rozmazane (chalky) Oświetlenie i cieniowanie
InterpolacjaPhonga Opiera się na interpolacji normalnych sąsiadujących wielokątów. Bui-Tuong Phong: „Illumination for Computer Generated Pictures”, CACM 18(6), June 1975, 311-317. Oświetlenie i cieniowanie
InterpolacjaPhonga • Zalety: • Cieniowanie wysokiej jakości z ostrymi odblaskami Wady: • Metoda kosztowna obliczeniowo • Jest to jednak metoda przybliżona, co w niektórych przypadkach jest widoczne Oświetlenie i cieniowanie
Wektorynormalne w OpenGL Wektornormalny do danejpowierzchni jest do niejprostopadły w określonympunkcie. Wykorzystywaliśmypojęciewektoranormalnego w modeluobliczanianatężeniaświatłaodbitego. W OpenGL, gdziepowierzchniereprezentowanesąprzezsiatkiwielokątówwektornormalnymożebyćstowarzyszony z wielokątem (jest to wtedyrzeczywistanormalna w sensiematematycznym) Oświetlenie i cieniowanie
Wektorynormalne – użycie wspólnego wektora dla wielokąta glNormal3f( nx, ny, nz ); glBegin( GL_TRIANGLES ); glVertex3fv( v1 ); glVetrex3fv( v2 ); glVertex3fv( v3 ); glEnd(); Oświetlenie i cieniowanie
Obliczaniewektorównormalnychdlawielokątów Tradycyjny sposób z użyciem wyznaczników: Oświetlenie i cieniowanie
Obliczaniewektorównormalnychdlapowierzchnikrzywoliniowych Oświetlenie i cieniowanie
Wektorynormalne– dla każdego wierzchołka oddzielnie glBegin( GL_TRIANGLES ); glNormal3fv( n1 ); glVertex3fv( v1 ); glNormal3fv( n2 ); glVetrex3fv( v2 ); glNormal3fv( n3 ); glVertex3fv( v3 ); glEnd(); Oświetlenie i cieniowanie
Wektorynormalne, c.d. glBegin(GL_QUADS); glColor3f(1,1,1); glNormal3f(0,0,1); glVertex3f(1,1,0); glColor3f(1,1,1); glNormal3f(0,0,1); glVertex3f(-1,1,0); glColor3f(1,1,1); glNormal3f(0,0,1); glVertex3f(-1,-1,0); glColor3f(1,1,1); glNormal3f(0,0,1); glVertex3f(1,-1,0); glEnd(); glBegin(GL_QUADS); glColor3f(1,1,1); glNormal3f(0,0,1); glVertex3f(1,1,0); glVertex3f(-1,1,0); glVertex3f(-1,-1,0); glVertex3f(1,-1,0); glEnd(); Oświetlenie i cieniowanie
Jeszcze o normalnych • Normalne powinny być normalizowane • Różne długości zniekształacają kolory • Skalowanie wpływa na długość normalnej • Rotacja i translacja – nie glEnable( GL_NORMALIZE ); Oświetlenie i cieniowanie
Obliczanieoświetlenia w OpenGL Wyznaczamywektorynormalne w każdymwierzchołkukażdegoobiektu. Definiujemyźródłaświatła Definiujemy model oświetlenia definiujemywłasnościmateriałoweobiektównascenie Oświetlenie i cieniowanie
Mieszaniekolorów (blending) Mieszanie kolorów wykorzystuje kanał (współczynnik) Obiekt przesłaniający nazywamy źródłem (source), a obiekt przesłaniany – celem (target). Uaktywnienie możliwości mieszania:glEnable( GL_BLEND ); Następnie wywołujemy:glBlendFunc(<source>,<target>) Oświetlenie i cieniowanie
GL_ZERO Kolorem źródła jest (0,0,0,0) GL_ONE Wykorzystuje bieżący kolor źródła GL_DST_COLOR Mnoży kolor źródła przez kolor celu GL_ONE_MINUS_DST_COLOR Mnoży kolor źródła przez dopełnienie koloru celu GL_SRC_ALPHA Mnoży kolor źródła przez wartość alfa źródła GL_ONE_MINUS_SRC_ALPHA Mnoży kolor źródła przez dopełnienie wartości alfa źródła GL_DST_ALPHA Mnoży kolor źródła przez wartość alfa celu GL_ONE_MINUS_DST_ALPHA Mnoży kolor źródła przez dopełnienie wartości alfa celu GL_SRC_ALPHA_SATURATE Mnoży kolor źródła przez mniejszą z wartości: alfa źródła lub dopełnienie alfa celu Funkcjełączeniaźródła Oświetlenie i cieniowanie
GL_ZERO Kolorem celu jest (0,0,0,0) GL_ONE Wykorzystuje bieżący kolor celu GL_SRC_COLOR Mnoży kolor celu przez kolor źródła GL_ONE_MINUS_SRC_COLOR Mnoży kolor celu przez dopełnienie koloru źródła GL_SRC_ALPHA Mnoży kolor celu przez wartość alfa źródła GL_ONE_MINUS_SRC_ALPHA Mnoży kolor celu przez dopełnienie wartości alfa źródła GL_DST_ALPHA Mnoży kolor celu przez wartość alfa celu GL_ONE_MINUS_DST_ALPHA Mnoży kolor celu przez dopełnienie wartości alfa celu GL_SRC_ALPHA_SATURATE Mnoży kolor celu przez mniejszą z wartości: alfa źródła lub dopełnienie alfa celu Funkcjełączeniacelu Oświetlenie i cieniowanie
Łączeniecelu i źródła, c.d. Dosyć tego sporo. W sumie 9 x 9 = 81 możliwości. Na szczęście większość można pominąć i ograniczyć się do kilku. Ważniejsze jest testowanie bufora głębokości i kolejność rysowania obiektów. Oświetlenie i cieniowanie
Łączeniekolorów c.d. Właczenie glEnable(GL_DEPTH_TEST) umożliwia zasłanianie jednych obiektów przez drugie, bez względu na kolejność rysowania. Jednak kolejność rysowania obiektów na scenie ma znaczenie w przypadku przezroczystości! Oświetlenie i cieniowanie
Ogólnezasady • Najpierw rysujemy obiekty nieprzezroczyste przy włączonym buforze głębokości. • Przełączamy bufor głebokości w tryb: tylko do odczytu przez glDepthMask(GL_FALSE). • W tym trybie rysujemy obiekty przezroczyste – zostaną on poprawnie umieszczone względem nieprzezroczystych. • Przywracamy normalny tryb pracy bufora głebokości glDepthMask(GL_TRUE); Oświetlenie i cieniowanie