1 / 39

Oświetlenie w OpenGL

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

hollye
Download Presentation

Oświetlenie w OpenGL

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Oświetlenie w OpenGL Rozwiązanie dla OpenGL 2.1

  2. 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)

  3. Ś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

  4. Uwagi do parametrówfunkcji glLight GL_POSITION: gdy w=0 – światłokierunkoweświecące w kierunku (-x, -y, -z)gdy w0 – ś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

  5. 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 )

  6. 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

  7. 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

  8. 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

  9. Parametrymateriałowe void glMaterialfv(face, pname,value); face: GL_FRONT | GL_BACK | GL_FRONT_AND_BACK pname: Oświetlenie i cieniowanie

  10. 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

  11. 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

  12. 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( );

  13. 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

  14. 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

  15. 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

  16. 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

  17. 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

  18. Cieniowaniestałąwartością Realizacja w OpenGL: glShadeModel( GL_FLAT ); Alternatywnie można uruchomić wygładzanie Gourauda glShadeModel( GL_SMOOTH ); Oświetlenie i cieniowanie

  19. 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

  20. 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

  21. InterpolacjaGourauda Oświetlenie i cieniowanie

  22. InterpolacjaGourauda - efekty Oświetlenie i cieniowanie

  23. 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

  24. 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

  25. 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

  26. 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

  27. 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

  28. Obliczaniewektorównormalnychdlawielokątów Tradycyjny sposób z użyciem wyznaczników: Oświetlenie i cieniowanie

  29. Obliczaniewektorównormalnychdlapowierzchnikrzywoliniowych Oświetlenie i cieniowanie

  30. 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

  31. 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

  32. 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

  33. 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

  34. 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

  35. 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

  36. 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

  37. Łą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

  38. Łą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

  39. 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

More Related