Teksturowanie (ang. texture mapping) Radosław Mantiuk Wydział Informatyki Zachodniopomorski Uniwersytet Technologiczny
Tekstura Funkcja modyfikująca wygląd powierzchni. Ta funkcja może być reprezentowana przez bitmapę.
Przykłady: nie tylko modifikacja koloru
Potok teksturowania 1. Mapowanie tekstury (ang. texture mapping) - obliczenie współrzędnych parametrycznych (u,v) dla każdego wierzchołka modelu. 2. Filtrowanie tekstury - obliczenie współrzednych teksela tekstury w rastrze (s,t) (funkcja korespondera, powiększanie lub pomniejszanie bitmapy). 3. Nakładanie tekstury - modyfikacja koloru pikseli na etapie rasteryzacji. Pictures courtasy of MIT, Lecture Notes 6.837
Mapowanie tekstur Obliczenie współrzędnych parametrycznych (u,v), odpowiadających danemu wierzchołkowi modelu. Współrzędne (u,v) wyraża się jako liczby zmiennoprzecinkowe znormalizowane do przedziału <0,1>. v (u3,v3) (u1,v1) (u2,v2) u
Mapowanie tekstur tekstura model
Mapowanie tekstur Liniowe Cylindryczne Sferyczne
Teksturowanie: mapowanie sferyczne Obliczenie współrzędnych tekstury (u,v) dla puntu na powierzchni kuli (d x,d y,d z ) dla kuli o promieniu jednostkowym. u = 0.5+ arctan2(d z, d x ) 2π v = 0.5+ arcsin(d y) π
Funkcje korespondera Funkcje korespondera - powiekszanie tekstury do wymaganego rozmiaru poprzez powielanie.
Współrzędne tekstury Obliczenie położenia teksela tekstury odpowiadająceg danemu wierchołkowi Zamiania współrzędnych (u,v) -> (s,t) Filtrowanie tekstur - ma na celu dostosowanie wielkości tekstury do wielkości obszaru, na który tekstura będzie nakładana powiększenie i pomniejszenie W idelanym przypadku tekstura powinna mieć cztery razy więcej tekseli (ang. texels) od liczby pikseli znajdującej się w obszarze obrazu (bufora ramki), na który tekstura jest mapowana.
Filtrowanie tekstur: Metoda najbliższego sąsiada Przykład pomniejszenia tekstury. (u,v)
Filtrowanie tekstur: filtracja dwuliniowa filtrowanie dwuliniowe (ang. bilinear filtering) uśrednianie wartości piksela (u,v)
OpenGL: Nakładanie tekstury
OpenGL: Teksturowanie glbegin(gl_quads); glnormal3f( 0, 0, -1.0f ); gltexcoord2f( 1.0f, 1.0f ); glvertex3f( -0.5f, +0.5f, -0.5f ); gltexcoord2f( 0.0f, 1.0f ); glvertex3f( +0.5f, +0.5f, -0.5f ); gltexcoord2f( 0.0f, 0.0f ); glvertex3f( +0.5f, -0.5f, -0.5f ); gltexcoord2f( 1.0f, 0.0f ); glvertex3f( -0.5f, -0.5f, -0.5f ); glend(); Współrzędne interpolowane na etapie rasteryzacji.
OpenGL: Teksturowanie GLuint tex; glgentextures( 1, &tex); glbindtexture( GL_TEXTURE_2D, tex); gltexparameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT ); gltexparameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT ); gltexparameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); gltexparameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); // Black/white checkerboard float pixels[] = { 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f }; glteximage2d(gl_texture_2d, 0, GL_RGB, 2, 2, 0, GL_RGB, GL_FLOAT, pixels); void glteximage2d(glenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid * data);
OpenGL: Typy tekstur GL_TEXTURE_1D: Images in this texture all are 1-dimensional. They have width, but no height or depth. GL_TEXTURE_2D: Images in this texture all are 2-dimensional. They have width and height, but no depth. GL_TEXTURE_3D: Images in this texture all are 3-dimensional. They have width, height, and depth. GL_TEXTURE_RECTANGLE: The image in this texture (only one image. No mipmapping) is 2- dimensional. Texture coordinates used for these textures are not normalized. GL_TEXTURE_BUFFER: The image in this texture (only one image. No mipmapping) is 1-dimensional. The storage for this data comes from a Buffer Object. (u,v) GL_TEXTURE_CUBE_MAP: There are exactly 6 distinct sets of 2D images, all of the same size. They act as 6 faces of a cube. GL_TEXTURE_1D_ARRAY: Images in this texture all are 1-dimensional. However, it contains multiple sets of 1-dimensional images, all within one texture. The array length is part of the texture's size. GL_TEXTURE_2D_ARRAY: Images in this texture all are 2-dimensional. However, it contains multiple sets of 2-dimensional images, all within one texture. The array length is part of the texture's size. GL_TEXTURE_CUBE_MAP_ARRAY: Images in this texture are all cube maps. It contains multiple sets of cube maps, all within one texture. The array length * 6 (number of cube faces) is part of the texture size. GL_TEXTURE_2D_MULTISAMPLE: The image in this texture (only one image. No mipmapping) is 2- dimensional. Each pixel in these images contains multiple samples instead of just one value. GL_TEXTURE_2D_MULTISAMPLE_ARRAY: Combines 2D array and 2D multisample types. No mipmapping.
Filtrowanie tekstur - MIP Mapping MIP Mapping (multium in parvo - wiele w jednym) - sposób przechowywania i szybkiego dostępu do tekstur o różnym rozmiarze. (u,v) automatyczne generowanie i obsługa mipmap przez OpenGL
Filtrowanie anizotropowe Jeżeli proporcje tekstury nie pasują do proporcji obszaru pikseli, na które tekstura ma zostać nałożona. (u,v)
Filtrowanie perspektywiczne Interpolacja współrzędnych tekstur w trójkącie uwzględniająca trójwymiarowe położenie wierzchołków. (u,v) Uwzględnienie głębokości (a konkretniej jej odwrotnoś ci) podczas interpolowania współrzędnej tekstury.
Mapowanie środowiska Ang. Environment Mapping (EM) - wykorzystanie testury do aproksymacji powierzchni odbijających. Pictures courtasy of MIT, Lecture Notes 6.837
Mapowanie środowiska
Mapowanie nierówności (ang. bump mapping) Bump mapping - wykorzystanie tekstury do modyfikacji wektora normalnego. (u,v) Pictures courtasy of MIT, Lecture Notes 6.837
Mapowanie przesunięć (ang. displacement mapping) Displacement mapping - tekstura służy do modyfikacji geometrii obiektu. (u,v)
Testury proceduralne Wykorzystanie funkcji matematycznych do obliczania wartości tekseli. (u,v) tekstury trójwymiarowe symulacje zjawisk fizycznych (np. przepływ wody) istnieje problem aliasingu i zachowania ciągłości
Cache'owanie tekstur Przesyłanie tekstur do pamięci GPU zajmuje dużo czasu. Dostęp do danych tektury jest również czasochłonne. Szybki dostęp do potrzebnej w danym momencie tektury: tektury powinny być możliwie najmniejsze, wielokąty pogrupowane zgodnie z przynależnością do tektury, oddalone wielokąty teksturowane są za pomocą (u,v) mniejszych obrazów, kompresja tekstur (S3TC, ETC)
Atlasy tekstur