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

Podobne dokumenty