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

Podobne dokumenty