height
Transkrypt
height
Wizualizacja 3D Mapa pikselowa • Mapy bitowe (poprzednie wykłady) przechowują informację w tablicach w postaci zer i jedynek. • Mapy pikselowe przechowują informację o pojedynczym pikselu zapisaną nawet wieloma bajtami. • Mapa pikselowa może przechowywać informacje o obrazie w formacie RGB lub RGBA. • OpenGL umożliwia wykonanie większej liczby operacji na mapach pikselowych niż na mapach bitowych. Rysowanie mapy pikselowej • Funkcja rysująca mapę pikselową w danej pozycji rastra (patrz poprzednie wykłady): • void glDrawPixels( GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * pixels ) • gdzie: – – – – – width – szerokość mapy w pikselach, height – wysokość mapy w pikselach, format – format mapy pikselowej, type – format pikseli mapy, pixels – wskaźnik na dane mapy pikselowej • Dane mapy pikselowej są umieszczone w podobny sposób jak w mapie bitowej – w wierszach „do góry nogami”. • Organizację wierszy oraz wyrównanie regulowane są za pomocą funkcji glPixelStoref lub glPixelStorei (patrz poprzednie wykłady). Formaty danych pikseli Parametr format opisuje następujące formaty zapisanych danych: • GL_COLOR_INDEX - indeksy kolorów, • GL_STENCIL_INDEX - dane bufora szablonu, • GL_DEPTH COMPONENT - dane bufora głębokości, • GL_RED - wyłącznie składowe czerwone pikseli bufora koloru, • GL_GREEN - wyłącznie składowe zielone pikseli bufora koloru, • GL_BLUE - wyłącznie składowe niebieskie pikseli bufora koloru, • GL_ALPHA - wyłącznie składowe alfa pikseli bufora koloru, • GL_RGB - składowe RGB pikseli bufora koloru, • GL_RGBA - składowe RGBA pikseli bufora koloru, • GL_BGR - składowe BGR pikseli bufora koloru, • GL_BGRA - składowe BGRA pikseli bufora koloru, • GL_LUMINANCE - składowe L (odcienie szarości) pikseli bufora koloru, • GL_LUMINANCE_ALPHA - składowe LA (odcienie szarości i kanał alfa) pikseli bufora koloru. Typy map pikselowych Parametr type opisuje następujące mapy pikselowe: • GL_UNSIGNED_BYTE – Glubyte – domyślnie stosowana • GL_FLOAT - Glfloat Parametr type dla upakowanych formatów RGB, RGBA, BGR i BGRA: • GL_UNSIGNED_BYTE_3_3_2 – 8-bitowe – dla RGB • GL_UNSIGNED_BYTE_2_3_3_REV – 8-bitowe – dla BGR • GL_UNSIGNED_SHORT_5_6_5 – 16-bitowe – dla RGB • GL_UNSIGNED_SHORT_5_6_5_REV – 16-bitowe – dla BGR • GL_UNSIGNED_SHORT_4_4_4_4 – 16-bitowe – dla RGBA • GL_UNSIGNED_SHORT_4_4_4_4_REV – 16-bitowe – dla BGRA • GL_UNSIGNED_SHORT_5_5_5_1 – 16-bitowe – dla RGBA • GL_UNSIGNED_SHORT_1_5_5_5_REV – 16-bitowe – dla BRGA • GL_UNSIGNED_INT_8_8_8_8 – 32-bitowe – dla RGBA • GL_UNSIGNED_INT_8_8_8_8_REV – 32-bitowe – dla BGRA • GL_UNSIGNED_INT_10_10_10_2 – 32-bitowe – dla RGBA • GL_UNSIGNED_INT_2_10_10_10_REV – 32-bitowe – dla BGRA Odczyt mapy pikselowej • Możliwy jest odczyt mapy pikselowej z bufora koloru do bufora pamięci za pomocą funkcji void glReadPixels( GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid * pixels ) • gdzie: – x, y - współrzędne położenia lewego dolnego rogu odczytywanej mapy, – width - szerokość mapy w pikselach, – height - wysokość mapy w pikselach, – format - format danych mapy pikselowej, – type - format pikseli mapy, – pixels - wskaźnik na bufor mapy pikselowej Kopiowanie mapy pikselowej • Przy pomocy funkcji void glCopyPixels( GLint x, GLint y, GLsizei width, GLsizei height, GLenum type ) • Można skopiować prostokątny obszar z jednego obszaru bufora ramki do drugiego. • Parametr type określa bufor, który ma być kopiowany: • GL_COLOR - bufor koloru, • GL_DEPTH - bufor głębokości, • GL_STENCIL - bufor szablonu. Przykład Teksturowanie • Teksturowanie to jeden z najważniejszych mechanizmów biblioteki OpenGL. • Umożliwia znaczne zwiększenie realizmu generowanej grafiki. • Mechanizmy związane z teksturowaniem są bardzo obszerne Kilka kroków do tekstury • • • • • • Wczytanie obrazka Pobranie „nazwy” tekstury (glGenTextures) Wybór aktualnej tekstury (glBindTexture) Tworzenie tekstury (glTexImage2D) Ustawienie parametrów (glTexParametri) Dopasowanie pozycji tekstury do wierzchołka wielokąta (glTextCoord2f) Włączenie teksturowania • Włączenie i wyłącznie teksturowania wymaga wywołania funkcji glEnable/glDisable z jednym z następujących parametrów: – – – – GL_TEXTURE_1D - tekstura jednowymiarowa, GL_TEXTURE_2D - tekstura dwuwymiarowa, GL_TEXTURE_3D - tekstura trójwymiarowa (od wersji 1.2), GL_TEXTURE_CUBE_MAP - tekstura sześcienna (od wersji 1.3). glEnable(GL_TEXTURE_2D); • Biblioteka OpenGL w danej chwili obsługuje tylko jeden rodzaj tekstury Definiowanie tekstury • Definiowanie tekstury umożliwiają funkcje: void glTexImage1D( GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid * pixels ) void glTexImage2D( GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid * pixels ) void glTexImage3D( GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid * pixels ) Parametr target • • Parametr target określa rodzaj tekstury Dla tekstury 1D – – • Dla tekstury 2D – – – – – – – – – • GL_TEXTURE_1D - tekstura jednowymiarowa, GL_PROXY_TEXTURE_1D - jednowymiarowa tekstura zastępcza (proxy). GL_TEXTURE_2D - tekstura dwuwymiarowa GL_PROXY_TEXTURE_2D - dwuwymiarowa tekstura zastępcza, GL_TEXTURE_CUBE_MAP_POSITIVE_X - tekstura sześcienna dla kierunku dodatnich wartości osi X, GL_TEXTURE_CUBE_MAP_NEGATIVE_X - tekstura sześcienna dla kierunku ujemnych wartości osi X, GL_TEXTURE_CUBE_MAP_POSITIVE_Y - tekstura sześcienna dla kierunku dodatnich wartości osi Y, GL_TEXTURE_CUBE_MAP_NEGATIVE_Y - tekstura sześcienna dla kierunku ujemnych wartości osi Y, GL_TEXTURE_CUBE_MAP_POSITIVE_Z - tekstura sześcienna dla kierunku dodatnich wartości osi Z, GL_TEXTURE_CUBE_MAP_NEGATIVE_Z - tekstura sześcienna dla kierunku ujemnych wartości osi Z, GL_PROXY_TEXTURE_CUBE_MAP - zastępcza tekstura sześcienna. Dla tekstury 3D – – GL_TEXTURE_3D - tekstura trójwymiarowa GL_PROXY_TEXTURE_3D - trójwymiarowa tekstura zastępcza. Parametr level, internalformat • Parametr level określa poziom kolejnej tworzonej mipmapy. • Wartość 0 oznacza poziom podstawowy tekstury. • Parametr internalformat określa wewnętrzny format danych tekstury. • Może przyjmować wartość 1, 2, 3 lub 4. Wartość ta odpowiada ilości składowych opisujących jeden teksel (piksel tekstury). • Dla kolorów RGB podaje się liczbę 3 (1 bajt na kolor) Parametry width, height, depth • Parametry width, height i depth określają odpowiednio szerokość, wysokość i głębokość tekstury wraz z obramowaniem. Ilość dostępnych wymiarów zależy oczywiście od rodzaju tekstury. Depth powinien przyjmować najczęściej liczbę 0. • Każdy z wymiarów tekstury wyraża się liczbą całkowitą większą od zera, która do wersji 2.0 biblioteki OpenGL musiała być potęgą liczby 2, czyli wysokość i szerokość równa była wartościom 64,128,256… (64 to minimum). Parametr border, format, type, pixels • Parametr border służy do określenia szerokości obramowania tekstury. – 0 – brak obramowania – 1 – tekstura posiada obramowanie. • Parametr format określa format danych tekstury: GL_COLOR_INDEX, GL_DEPTH_COMPONENT, GL_RED, GL_GREEN, GL_BLUE, GL_ALPHA, GL_RGB, GL_RGBA, GL_BGR, GL_BGRA, GL_LUMINANCE Najczęściej jest to GL_RGB lub GL_RGBA • Parametr type określa określający format tekseli tekstury. Podobnie jak przy funkcji glDrawPixels. Najczęściej GL_UNSIGNED_BYTE. • Parametr pixels to wskaźnik do danych tekstury Kopiowanie tekstury z bufora kolorów • Tekstury mogą być tworzone z pikseli pobranych z bufora kolorów: • void glCopyTexImage1D( GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border ) • void glCopyTexImage2D( GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border ) • x i y określają współrzędne punktu w buforze kolorów, od którego mają być pobierane dane do tekstury. odpowiadają lewemu dolnemu końcowi danych tekstury Inne funkcje zmieniające tekstury • Funkcja podmieniające część danych tekstury – glTexSubImage1D – void glTexSubImage2D( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * pixels ) – glTexSubImage3D (od OGL 1.2) • Funkcja podmieniająca fragment danych z tekstury poprzez kopiowanie danych z bufora kolorów – glCopyTexSubImage1D – void glCopyTexSubImage2D( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height ) Współrzędne tekstury • Współrzędne tekstury są określane poprzez współrzędne – s (dla tekstury jednowymiarowej) – s, t (dla tekstury dwuwymiarowej) – s, t, q (dla tekstury trójwymiarowej) • Zakres współrzędnych tektury jest zawsze od 0 do 1. Można jednak podawać wartości spoza tego zakresu uzyskując powielenie tekstury. Współrzędne tekstury cd. • Współrzędne tekstury przypisuje się poszczególnym wierzchołkom podobnie jak kolory. Służą do tego funkcje glTextCoord void glTexCoord1f( GLfloat s ) – dla tekstury jednowymiarowej void glTexCoord2f( GLfloat s, GLfloat t ) – dla tekstury dwuwymiarowej • Powyższe funkcje istnieją również w wersji dla liczb typu double, integer lub odpowiednich tablic Parametry tekstur • Parametry związane z daną teksturą można zmieniać za pomocą funkcji void glTexParameterf( GLenum target, GLenum pname, GLfloat param ) void glTexParameteri( GLenum target, GLenum pname, GLint param ) void glTexParameterfv( GLenum target, GLenum pname, const GLfloat * params ) void glTexParameteriv( GLenum target, GLenum pname, const GLint * params ) • Gdzie: – Target – rodzaj tekstury GL_TEXTURE_1D, GL_TEXTURE_2D – Parametr – nazwa parametru – Params – wartość dla danego parametru Filtrowanie • Podczas teksturowania piksele są rozciągane lub ściskane w stosunku do oryginalnej wielkości. Dopasowanie tekstury do potrzebnych rozmiarów nazywa się filtrowaniem. • OpenGL pozwala na ustalenie metody filtrowania dla powiększania (magnification) i pomniejszania (minification) zwykłych tekstur: – Metoda najbliższego sąsiada (GL_NEAREST) – Metoda filtrowania linowego (GL_LINEAR) – interpolacja najbliższych tekseli tektury • Paramtry te ustala się funkcją glTexParemeter zmieniajac parametry GL_TEXTURE_MAG_FILTER i GL_TEXTURE_MIN_FILTER Filtrowanie mipmap • Dla filtrowania mipmap można wybrać z kolejnych czterech dodatkowych metod filtrowania pomniejszającego: – GL_NEAREST_MIPMAP_NEAREST – stosowany jest algorytm najbliższego sąsiada dla mipmapy najbardziej odpowiadającej rozmiarowi obiektu – GL_NEAREST_MIPMAP_LINEAR – na dwóch mipmapach najbardziej odpowiadających rozmiarowi obiektu wykonywana jest liniowa interpolacja a następnie stosowany jest algorytm najbliższego sąsiada, – GL_LINEAR_MIPMAP_NEAREST – stosowany jest algorytm filtrowania liniowego na mipmapie najbardziej odpowiadającej rozmiarowi obiektu, – GL_LINEAR_MIPMAP_LINEAR - wykonywane jest filtrowanie trójliniowe (na dwóch mimpmapach jest wykonywane liniowa interpolacja, a następnie stosowane jest filtrowanie liniowe). Filtrowanie – ustawienie parametrów • Parametry filtrowania ustawia się funkcją glTexParameter • GL_TEXTURE_MIN_FILTER może przyjąć wartości: – – – – – – GL_NEAREST, GL_LINEAR, GL_NEAREST_MIPMAP_NEAREST, GL_NEAREST_MIPMAP_LINEAR, GL_LINEAR_MIPMAP_NEAREST, GL_LINEAR_MIPMAP_LINEAR • GL_TEXTURE_MAG_FILTER: – GL_NEAREST, – GL_LINEAR Zapamiętanie tekstur • W OpenGL tekstury mogą być identyfikowane unikalną liczbą. Do wygenerowania n liczby identyfikatorów służy funkcja void glGenTextures(GLsizei n, GLuint * textures ) • gdzie n – liczba zarezerwowanych numerów, textures – tablica, gdzie zostaną wpisane numery. • Przed użyciem konkretnej tekstury należy ją wskazać korzystając z funkcji void glBindTexture( GLenum target, GLuint texture ) • Gdzie target wskazuje rodzaj tekstury (GL_TEXTURE_1D, GL_TEXTURE_2D lub GL_TEXTURE_3D), teksture to identyfikator tekstury uzyskany w poprzedniej funkcji. Przykład Zawijanie • Przy określaniu współrzędnych tekstur wartości mogą przekraczać przedział 0,1. • Sposób radzenia sobie z zawijaniem lub powielaniem tekstury określa się poprzez zmianę parametrów GL_TEXTURE_WRAP_S, GL_TEXTURE_WRAP_T i GL_TEXTURE_WRAP_R przy pomocy funkcji glTexParameter. • Możliwe są następujące sposoby renderingu tekstury: – GL_REPEAT – przy każdym przekroczeniu wartości 0,1 następuje powtórzenie tekstury – GL_CLAMP - wartości danej współrzędnej są obcinane do przedziału [0, 1]. Pozostałe teksele, przy obliczaniu filtrowania liniowego, są pobierane z obramowania tekstury lub koloru brzegu tekstury (wersja 1.2) – GL_CLAMP_TO_EDGE – przy obliczaniu filtrowania liniowego teksele są obliczane z brzegu tekstury (wersja 1.3) – GL_MIRRORED_REPEAT – podobnie jak GL_REPEAT, ale tekstura jest lustrzanym odbiciem (wersja 1.4) Przykład Mipmapy • Mipmapy można wykonać w dowolnym programie graficznym i przekazać je do OpenGL-a ustalając parametr level podczas wywołania funkcji glTextImage. • W bibliotece GLU znajdują się funkcje, które automatyzują generowanie mipmap. Skalowanie obrazu zawartego w teksturze GLint gluScaleImage( GLenum format, GLint widthin, GLint heightin, GLenum typein, const GLvoid * datain, GLint widthout, GLint heightout, GLenum typeout, GLvoid * dataout ) • Funkcja ma za zadnie przeskalowanie wejściowego obrazu (parametry takie same jak w funkcji glTexImage) na teksturę o podanej szerokości (widthout), wysokości (heightout), typie (typeout) i zapisanie ich w pamięci (dataout). Automatyczne tworzenie mipmap • Funkcje automatycznie generujące mipmapy – biblioteka GLUT: gluBuild1DMipmaps GLint gluBuild2DMipmaps( GLenum target, GLint components, GLint width, GLint height, GLenum format, GLenum type, const GLvoid * data ) gluBuild3DMipmaps • Argumenty funkcji są identyczne jak w funkcji glTexImage – brakuje level i border. • Tekstura zostanie automatycznie przeskalowana do potęg liczby 2 Przykład