Oprogramowanie i wykorzystanie stacji roboczych Wykład 9
Transkrypt
Oprogramowanie i wykorzystanie stacji roboczych Wykład 9
Oprogramowanie i wykorzystanie stacji roboczych Wykład 9 Dr inż. Tomasz Olas [email protected] Instytut Informatyki Teoretycznej i Stosowanej Politechnika Cz˛estochowska Wykład 9 – p. 1/3 Teksturowanie Teksturowanie jest jednym z najważniejszych mechanizmów grafiki komputerowej pozwalajacym ˛ na zwiekszenie ˛ realizmu generowanej grafiki. OpenGL już od wersji 1.0 zawiera pełny zestaw funkcji realizujacych ˛ nakładanie, filtrowanie i przekształcanie tekstur. Rodzaje tekstur: jednowymiarowe (1D), dwuwymiarowe (2D), trójwymiarowe (wolumeryczne) - od wersji 1.2 OpenGL, sześcienne (kubiczne) - od wersji 1.3. Wykład 9 – p. 2/3 Tekstury Tekstura jest zbiorem pixeli (texeli), w przypadku 2D jest tablica˛ dwuwymiarowa. ˛ W OpenGL szerokość wysokość i głebia ˛ tekstury musza˛ być potegami ˛ dwójki. Poszczególne piksele tekstury nazywa sie˛ texelami. Wykład 9 – p. 3/3 Proces nakładania tekstury 1. Utworzenie obiektu tekstury. 2. Określenie w jaki sposób tekstura ma być odwzorowana na poszczególne punkty. 3. Właczenie ˛ mapowania tekstur. 4. Renderowanie sceny uwzgledniaj ˛ ace ˛ zarówno współrz˛edne obiektów, jak również odwzorowanie tekstury. Wykład 9 – p. 4/3 Utworzenie obiektu tekstury Utworzenie obiektu tekstury 2D polega na: Wygenerowaniu lub wczytaniu tablicy reprezentujacej ˛ poszczególne texele tworzonej tekstury. Zdefiniowaniu tekstury w OpenGL poprzez wywołanie funkcji glTexImage2D z parametrami charakteryzujacymi ˛ tworzona˛ teksture. ˛ Wykład 9 – p. 5/3 Definiowanie tekstur 2D (I) W OpenGL do definiowania dwuwymiarowych tekstur służy funkcja glTexImage2D: void glTexImage2D(GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels); gdzie: target - GL_TEXTURE_2D. level - poziom szczegółów mipmapy. Jeśli nie sa˛ używane mipmapy zwykle wynosi zero. internalformat - ilość komponentów koloru, od 1 do 4. width - szerokość obrazu tekstury - musi być poteg ˛ a˛ liczby 2 lub być zgodna ze wzorem 2n + 2 ∗ border. height - wysokość obrazu tekstury - musi być poteg ˛ a˛ liczby 2 lub być zgodna ze wzorem 2m + 2 ∗ border. border - szerokość ramki dookoła obrazu tekstury (0 lub 1). lub 2. Wykład 9 – p. 6/3 Definiowanie tekstur 2D (II) void glTexImage2D(GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels); gdzie: format - format danych pikseli ( GL_COLOR_INDEX, GL_RED, GL_GREEN, GL_BLUE, GL_ALPHA, GL_RGB, GL_RGBA, GL_LUMINANCE, GL_ALPHA_LUMINANCE). type - typ danych dla wartości pikseli. pixels - dane pikseli. Wykład 9 – p. 7/3 Definiowanie tekstur 2D - Qt (I) Statyczna metoda klasy QGLWidget convertToGLFormat przekształca obiekt klasy QImage do postaci wymaganej przez funkcje glTexImage2D z biblioteki Qt. QImage QGLWidget::convertToGLFormat (const QImage & img) [static] Zwracana mapa bitowa nie może być używana jako standardowy obiekt klasy QImage, ale moga˛ być wykorzystywane metody width, height i bits Powyższa metoda dokonuje jedynie konwersji poszczególnych pikseli, nie jest dokonywana zmiana rozmiaru bitmapy - musi ona mieć odpowiednie rozmiary przed dokonaniem konwersji. Wykład 9 – p. 8/3 Definiowanie tekstur 2D - Qt (II) QImage tex1, buf; if (!buf.load("sky.bmp")) qDebug("Cannot open image file"); else tex1 = QGLWidget::convertToGLFormat(buf); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tex1.width(), tex1.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, tex1.bits()); Wykład 9 – p. 9/3 Filtrowanie tekstur W czasie nakładania tekstur bardzo żadko wystepuje ˛ sytuacja, w której pojedynczemu pikselowi widoku odpowiada dokładnie jeden teksel tekstury. Tekstura jest najcz˛eściej albo „ściskana” albo „rozciagana” ˛ w celu dopasowania do rozmiaru obiektu, na który jest nakładana. Proces dopasowania tekstury do wymaganych rozmiarów nazywa sie˛ filtrowaniem. W bibliotece OpenGL odrebnie ˛ określa sie˛ sposób filtrowania w przypadku „ściskania” (filtr pomniejszajacy), ˛ jak i „rozciagania” ˛ tekstury (filtr powiekszaj ˛ acy). ˛ Wykład 9 – p. 10/3 Paramety obrazu tekstury (I) glTexParameter[if](GLenum target, GLenum pname, GLfloat param); glTexParameter[if]v(GLenum target, GLenum pname, GLfloat *param); gdzie: target - musi to być GL_TEXTURE_1D lub GL_TEXTURE_2D. pname - określa parametr tekstury, który jest ustawiany: GL_TEXTURE_MIN_FILTER - określa metode˛ lub filtr stosowany przy zmniejszaniu tekstury. Wartościa˛ param może być: GL_NEAREST - filtrowanie „najbliższy sasiad” ˛ - pobierany jest najbliższy pixel obrazu tekstury, GL_LINEAR - liniowa interpolacja - przed narysowaniem czegokolwiek na ekranie wartości kolorów obrazu tekstury powinny zostać liniowo zinterpolowane, GL_NEAREST_MIPMAP_NEAREST - filtr mipmapy „najbliższy sasiad”, ˛ GL_NEAREST_MIPMAP_LINEAR - liniowo interpolowana mipmapa, GL_LINEAR_MIPMAP_NEAREST - liniowo interpolacja mipmap, GL_LINEAR_MIPMAP_LINEAR - liniowa interpolacja interpolowanych mipmap. Wykład 9 – p. 11/3 Parametry obrazu tekstury (II) glTexParameter[if](GLenum target, GLenum pname, GLfloat param); glTexParameter[if]v(GLenum target, GLenum pname, GLfloat *param); gdzie: pname cd: GL_TEXTURE_MAG_FILTER - określa metode˛ lub filtr stosowany przy powiekszaniu ˛ tekstury. Wartościa˛ param może być: GL_NEAREST - filtrowanie „najbliższy sasiad”, ˛ GL_LINEAR - liniowa interpolacja, GL_TEXTURE_WRAP_S - określa sposób traktowania współrz˛ednych S tekstury poza zakresem od 0.0 do 1.0. GL_TEXTURE_WRAP_T - określa sposób traktowania współrz˛ednych T tekstury poza zakresem od 0.0 do 1.0. GL_CLAMP GL_REPEAT GL_BORDER_COLOR - określa kolor ramki to tekstur bez ramki. Wykład 9 – p. 12/3 Parametry obrazu tekstury (III) filtr GL_NEAREST filtr GL_LINEAR Wykład 9 – p. 13/3 Parametry obrazu tekstury (IV) Wykład 9 – p. 14/3 Parametry teksturowania Funkcja glTexEnv ustawia parametry mapowania tekstury, sterujace ˛ sposobem nakładania obrazów tekstur na wielokaty: ˛ glTexEnv{fi}(GLenum target, GLenum pname, TYPE param); glTexEnv{fi}v(GLenum target, GLenum pname, TYPE *param); gdzie: target - definiowane środowisko teksturowania - musi nim być GL_TEXTURE_ENV. pname - nazwa definiowanego parametru: GL_TEXTURE_ENV_MODE - określa tryb teksturowania. Parametr param może przyjmować wartości: · GL_DECAL - obraz tekstury jest bezpośrednio nakładany na wielokat, ˛ · GL_VERB - przed nałożeniem na wielokat, ˛ obraz tekstury jest mieszany z określonym kolorem (GL_TEXTURE_ENV_COLOR). · GL_MODULATE - przed nałożeniem na wielokat, ˛ obraz tekstury jest mnożony przez istniejacy ˛ obraz w buforze ramki. GL_TEXTURE_ENV_COLOR - określa kolor do połaczenia ˛ z tekstura. ˛ W tym przypadku parametr param jest wskaźnikiem do wartości koloru RGBA. Wykład 9 – p. 15/3 Współrzedne ˛ tekstury Wykład 9 – p. 16/3 Określanie współrzednych ˛ tekstury Do określania współrz˛ednych tekstury dla wielokata, ˛ na który nakładamy teksture przeznaczona jest rodzina funkcji glTexCoord: glTexCoord1{dfis}(TYPE s); glTexCoord1{dfis}v(TYPE *s); glTexCoord2{dfis}(TYPE s, TYPE t); glTexCoord2{dfis}v(TYPE st); glTexCoord3{dfis}(TYPE s, TYPE t, TYPE r); glTexCoord3{dfis}v(TYPE *str); glTexCoord4{dfis}(TYPE s, TYPE t, TYPE r, TYPE q); glTexCoord4{dfis}v(TYPE strq); gdzie: s - pozioma współrz˛edna obrazu tekstury, t - pionowa współrz˛edna obrazu tekstury, r - współrz˛edna głebokości ˛ obrazu tekstury, q - współczynnik skalowania współrz˛ednych tekstur (rzeczywiste wartości współrz˛ednych wynosza˛ odpowiednio qs , qt , rq ). Wykład 9 – p. 17/3 Właczenie ˛ mapowania tekstur Właczenie ˛ mapowania tekstur 2D: glEnable(GL_TEXTURE_2D); Wyłaczenie ˛ mapowania tekstur 2D: glDisable(GL_TEXTURE_2D); Analogicznie można właczać ˛ i wyłaczać ˛ mapowanie tekstur jednowymiarowych (GL_TEXTURE_1D) i trójwymiarowych (GL_TEXTURE_3D) i sześciennych (GL TEXTURE CUBE MAP). Zaleca sie, ˛ aby w danej chwili był właczony ˛ tylko jeden rodzaj tekstur. Wykład 9 – p. 18/3 Tekstury 2D - przykład (I) const GLuint Texture = 1; QImage tex1, buf; if ( !buf.load( "sky.bmp" ) ) qDebug("Cannot open image file"); else tex1 = QGLWidget::convertToGLFormat( buf ); glNewList(Texture, GL_COMPILE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexImage2D(GL_TEXTURE_2D, 0, 3, tex1.width(), tex1.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, tex1.bits()); glEndList(); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); Wykład 9 – p. 19/3 Definiowanie tekstur 2D (III) glEnable(GL_TEXTURE_2D); glCallList(Texture); glBegin(GL_QUADS); glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 0.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(1.0f, 1.0f, 0.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(1.0f, -1.0f, 0.0f); glEnd(); Wykład 9 – p. 20/3 Definiowanie tekstur 2D (IV) Wykład 9 – p. 21/3 Mipmapy (I) Mipmapy umożliwiaja˛ dobór obrazu tekstury w zależności od odległości od obserwatora. Tekstura taka zawiera w sobie wiele obrazów. Wybierany jest obraz tekstury najbliższy rozmiarowi wielokata ˛ na ekranie. Stosowanie mipmap poprawia wyglad ˛ renderowanej sceny oraz zazwyczaj przyspiesza proces renderowania. Wykład 9 – p. 22/3 Mipmapy (II) Wielkość obrazów w mipmapie nie jest dowolna. Każdy nastepny ˛ stanowi 1/4 (1/2 × 1/2) rozmiaru poprzedniego obrazka. mipmapa o rozmiarze 128x128 bedzie ˛ zawierała obrazki o rozmiarach 128x128, 64x64, 32x32, 16x16, 8x8, 4x4, 2x2 i 1x1, natomiast mipmapa o rozmiarze 64x16 - 64x16, 32x8, 16x4, 8x2, 4x1, 2x1, 1x1. Wykład 9 – p. 23/3 Mipmapy - przykład QImage buf; buf.load("sky0.bmp"); QImage sky0 = QGLWidget::convertToGLFormat(buf); buf.load("sky1.bmp"); QImage sky1 = QGLWidget::convertToGLFormat(buf); buf.load("sky2.bmp"); QImage sky2 = QGLWidget::convertToGLFormat(buf); glNewList(1, GL_COMPILE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexImage2D(GL_TEXTURE_2D, 0, 3, 4, 4, 0, GL_RGB, GL_UNSIGNED_BYTE, sky0.bits()); glTexImage2D(GL_TEXTURE_2D, 1, 3, 2, 2, 0, GL_RGB, GL_UNSIGNED_BYTE, sky1.bits()); glTexImage2D(GL_TEXTURE_2D, 2, 3, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, sky2.bits()); glEndList(); Wykład 9 – p. 24/3 Paramety obrazu - mipmapy glTexParameter[if](GLenum target, GLenum pname, GLfloat param); glTexParameter[if]v(GLenum target, GLenum pname, GLfloat *param); dla: GL_TEXTURE_MIN_FILTER: GL_NEAREST_MIPMAP_NEAREST - wybiera mipmape, ˛ której teksele maja˛ rozmiar najbardziej zbliżony do pokrywanego piksela i używa filtra GL_NEAREST do wyznaczenia barwy piksela. GL_LINEAR_MIPMAP_NEAREST - podobnie jak wyżej, ale z użyciem kryterium GL_LINEAR (filtrowanie dwuliniowe). GL_NEAREST_MIPMAP_LINEAR - wybiera dwie mipmapy, których teksele maja˛ rozmiar najbardziej zbliżony do pokrywanego piksela, nastepnie ˛ posługuje sie˛ filtrem GL_NEAREST do wyznaczenia teksela z każdej mipmapy. Ostateczna wartość elementu tekstury jest średnia˛ ważona˛ dwóch poprzednich tekseli. GL_LINEAR_MIPMAP_LINEAR - tak jak wyżej, lecz z zastosowaniem opcji GL_LINEAR. Ten filtr jest też zwany trójliniowym (Trilinear Filtering). Wykład 9 – p. 25/3 Mipmapy - filtrowanie Wykład 9 – p. 26/3 Definiowanie tekstur 1D (I) W OpenGL do definiowania jednowymiarowych tekstur służy funkcja glTexImage1D: void glTexImage1D(GLenum target, GLint level, GLint components, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels); gdzie: target - musi być GL_TEXTURE_1D. level - poziom szczegółów mipmapy. Jeśli nie sa˛ używane mipmapy zwykle wynosi zero. component - ilość komponentów koloru, od 1 do 4. width - szerokość obrazu tekstury - musi być poteg ˛ a˛ liczby 2 lub być zgodna ze wzorem 2n + 2 ∗ border. border - szerokość ramki dookoła obrazu tekstury. Musi być 0, 1 lub 2. Wykład 9 – p. 27/3 Definiowanie tekstur 1D (II) void glTexImage1D(GLenum target, GLint level, GLint components, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels); gdzie: format - format danych pikseli: GL_COLOR_INDEX - wartości wszystkich pikseli sa˛ indeksami kolorów, GL_RED - wartości pikseli sa˛ intensywnościami czerwieni, GL_GREEN - wartości pikseli sa˛ intensywnościami zieleni, GL_BLUE - wartości pikseli sa˛ intensywnościami niebieskiego, GL_ALPHA - wartości pikseli sa˛ wartościami alfa, GL_RGB - wartości pikseli sa˛ wartościami RGB, GL_RGBA - wartości pikseli sa˛ wartościami RGBA, GL_LUMINANCE - wartości pikseli sa˛ kolorami w skali szarości, GL_ALPHA_LUMINANCE - wartości pikseli sa˛ wartościami alfa i kolorami w skali szarości. type - typ danych dla wartości pikseli. pixels - dane pikseli. Wykład 9 – p. 28/3 Mapowanie tekstur 1D - przykład (I) const GLuint RainbowTexture = 1; static unsigned char tecza[8][3] = { {0x3f, 0x00, 0x3f}, {0x7f, 0x00, 0x7f}, {0xbf, 0x00, 0xbf}, {0x00, 0x00, 0xff}, {0x00, 0xff, 0x00}, {0xff, 0xff, 0x00}, {0xff, 0x7f, 0x00}, {0xff, 0x00, 0x00} }; glNewList(RainbowTexture, GL_COMPILE); glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexImage1D(GL_TEXTURE_1D, 0, 3, 8, 0, GL_RGB, GL_UNSIGNED_BYTE, tecza); glEndList(); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); Wykład 9 – p. 29/3 Mapowanie tekstur 1D - przykład (II) glEnable(GL_TEXTURE_1D); glCallList(RainbowTexture); glBegin(GL_QUAD_STRIP); for (double th = 0.0; th <= M_PI; th += (0.03125 * M_PI)) { // dolna kraw˛ edź t˛ eczy x = cos(th) * 50.0; y = sin(th) * 50.0; z = -50.0; glTexCoord1f(0.0); glVertex3f(x, y, z); // górna kraw˛ edź t˛ eczy x = cos(th) * 55.0; y = sin(th) * 55.0; z = -50.0; glTexCoord1f(1.0); glVertex3f(x, y, z); } glEnd(); Wykład 9 – p. 30/3 Mapowanie tekstur 1D - przykład (III) Wykład 9 – p. 31/3 Biblioteka GLU Biblioteka GLU dodaje do biblioteki OpenGL dodatkowe funkcje wyższego poziomu. W skład biblioteki OpenGL wchodza˛ miedzy ˛ innymi: transformacje ze współrz˛ednych obiektu na współrz˛edne obserwatora i odwrotnie, wsparcie dla powierzchni NURBS, funkcje do podziału wielokatów ˛ na trójkaty, ˛ skalowanie rysunków 2D oraz tworzenie mipmap, dodatkowe funkcje wspierajace ˛ rzutowanie perspektywiczne i równoległe, zmiana pozycji kamery, wybór obiektów, funkcje do renderowania dysków, cylindrów oraz sfer, Wykład 9 – p. 32/3 Mipmapy - automatyczne generowanie W bibliotece GLU istnieja˛ funkcje do automatycznego generowania mipmap na podstawie pojedynczej tekstury Sa˛ to funkcje gluBuild1DMipmap, gluBuild2DMipmap, gluBuild3DMipmap oraz funkcje gluBuild1DMipmapLevels, gluBuild2DMipmapLevels i gluBuild3DMipmapLevels. Przykładowo: GLint gluBuild2DMipmaps (GLenum target, GLint components, GLint width, GLint height, GLenum format, GLenum type, const GLvoid *data); Generowanie mipmap w taki sposób jest realizowane na jednostce CPU, w zwiazku ˛ z tym jest stosunkowo wolne. W wersji 1.4 biblioteki OpenGL wprowadzono mechanizm automatycznego generowania mipmap (użycie funkcji glTexParameter z parametrem pname o wartości GL_GENERATE_MIPMAP). Wykład 9 – p. 33/3 Obiekty tekstur (I) Poczawszy ˛ od wersji 1.1 biblioteki OpenGL wprowadzono mechanizm obiektów tekstur. Obiekt tekstury pozwala na zapamietanie ˛ stanu tekstury (czyli danych tekstury wraz z jej parametrami). Przy pomocy odpowiedniej funkcji w prosty sposób można sie˛ przełaczać ˛ pomiedzy ˛ różnymi obiektami tekstur. Obiekty tekstur identyfikowane sa, ˛ podobnie jak listy wyświetlania, za pomoca˛ liczb całkowitych. Obiektom tekstur można również nadawać priorytety wpływajace ˛ na umieszczanie ich w pamieci ˛ karty graficznej (tekstury rezydentne). Wykład 9 – p. 34/3 Obiekty tekstur (II) W celu utworzenia zbioru identyfikatorów tekstur należy wywołać funkcje: ˛ void glGenTextures (GLsizei n, GLuint *textures); gdzie: n - liczba identyfikatorów tekstur, jakie maja˛ zostać utworzone, textures - tablica, w której zapisane zostana˛ utworzone identyfikatory. Obiekt tekstury ustawia sie˛ przy wykorzystaniu funkcji glBindTexture - po jej użyciu wszystkie funkcje zwiazane ˛ z ładowaniem tekstury i ustawianiem jej parametrów dotycza˛ aktualnego obiektu tekstury. void glBindTexture (GLenum target, GLuint texture); gdzie: target - rodzaj tekstury (GL_TEXTURE_1D, GL_TEXTURE_2D lub GL_TEXTURE_3D), texture - identyfikator tekstury. Funkcja ta odpowiada również za przełaczanie ˛ sie˛ pomiedzy ˛ obiektami tekstur. Wykład 9 – p. 35/3 Obiekty tekstur (III) Niepotrzebny obiekt tekstury może zostać usuniety ˛ za pomoca˛ funkcji: void glDeleteTextures (GLsizei n, GLuint *textures); gdzie: n - liczba identyfikatorów tekstur, jakie maja˛ zostać usuniete, ˛ textures - tablica, która zawiera identyfikatory tekstur jakie maja˛ zostać usuniete. ˛ Funkcja glIsTexture pozwala sprawdzić, czy istnieje obiekt tekstury o określonym identyfikatorze: GLboolean glIsTexture (GLuint texture); gdzie: texture - identyfikator tekstury, funkcja zwraca GL_TRUE, gdy istnieje obiekt tekstury o podanym identyfikatorze lub wartość GL_FALSE w przeciwnym wypadku. Wykład 9 – p. 36/3 Wieloteksturowanie (I) Wieloteksturowanie (multiteksturowanie) to technika pozwalajaca ˛ na jednoczesnego nakładania na obiekt wiecej ˛ niż jednej tekstury. Wieloteksturowanie wprowadzono w wersji 1.3 biblioteki OpenGL. We wcześniejszych implementacjach podobny efekt można uzyskać przy użyciu techniki teksturowania wieloprzebiegowego, które jest jednak bardziej skomplikowane (wymaga stosowania mieszania kolorów oraz wielokrotnego przeliczania geometrii renderowanego obiektu) oraz znacznie wolniejsze. Wykład 9 – p. 37/3 Wieloteksturowanie (II) Wybór aktualnej jednostki teksturujacej ˛ umożliwia funkcja: void glActiveTexture (GLenum texture); gdzie: texture - określa numer wybranej jednostki teksturujacej ˛ (GL_TEXTUREi, gdzie i przyjmuje wartość od 0 do 31). W przypadku wieloteksturowania definiowanie współrz˛ednych tekstur przy użyciu funkcji z grupy glTexCoord daje efekt tylko dla pierwszej jednostki teksturujacej ˛ (GL_TEXTURE0). Definiowane współrzednych tekstur dla dowolnej jednostki teksturujacej umozliwiajaja˛ funkcje z grupy glMultiTexCoord (posiadaja˛ dodatkowy parametr target określajacy ˛ numer jednostki teksturujacej). ˛ Przykład: void glMultiTexCoord2f (GLenum target, GLfloat s, GLfloat t); Wykład 9 – p. 38/3 Pozostałe funkcje Kopiowanie tekstury z bufora kolorów. Zmiana cz˛eści danych tekstury. Tekstury zastepcze ˛ (proxy). Kompresja tekstur. Automatyczne generowanie współrz˛ednych tekstur. Tekstury głebi. ˛ Wykład 9 – p. 39/3