Warsztat.GDCompo!ProjektyMediaArtykułyQ&AForumOferty pracyPobieranie

Opisz napotkaną sytuację, a redakcja niezwłocznie znajdzie rozwiązanie!

wyślij anuluj

Multitexturing w OpenGL

Tekst został importowany z Warsztatowych artykułów. Jego oryginalnym autorem jest halibut. Jeżeli został importowany poprawnie, usuń ten szablon!

Poniższy artykuł porusza temat multiteksturowania czyli nakładania wielu tekstur za jednym przebiegiem. Do zrealizowania tego celu posłużę się OpenGL i jego rozszerzeniami oraz językiem Delphi.

Pierwsze co musimy zrobić to sprawdzić czy karta obsługuje multiteksturowanie (powinna mieć wtedy co najmniej dwie jednostki teksturujące jak np. RivaTNT2, Voodo2 czy Geforce):

var jest_multitext:boolean; procedure inicjacja; begin jest_multitext:=pos('GL_ARB_MULTITEXTURE',uppercase(glGetString(GL_EXTENSIONS))); if jest_multitext=false then begin messagebox(0,'ten program wymaga karty obslugującej multiteksturowanie', 'błąd',mb_ok or mb_iconerror); halt; end; end;

Kiedy jesteśmy pewni, że karta obsługuje multiteksturowanie musimy pobrać parę nowych procedur które będą nam później potrzebne. W tym celu należy na początku programu wpisać :

var glActiveTextureARB:procedure (target:GLenum); stdcall; glMultiTexCoord2fARB:procedure (target:GLenum;u,v:GLfloat); stdcall;

Potrzebne nam będzie też parę nowych stałych :

const GL_MAX_TEXTURES_UNITS_ARB=$84E2; GL_TEXTURE0_ARB=$84C0;

Teraz musimy na koniec naszej procedury inicjującej dopisać kod pobierający adresy procedur zadeklarowanych wcześniej :

glActiveTextureARB:=wglGetProcAddress('glActiveTextureARB'); glMultiTexCoord2fARB:=wglGetProcAddress('glMultiTexCoord2fARB'); if (@glActiveTextureARB=nil) or (@glMultiTexCoord2fARB=nil) then begin messagebox(0,'brak procedur obsługujących multiteksturowanie','błąd',mb_ok or mb_iconerror); halt; end;

Oczywiście procedurę inicjuj należy wykonać na początku programu (najlepiej zaraz po zainicjowaniu OpenGL). Teraz jesteśmy już gotowi do multiteksturowania. Idea jego jest następująca : Mamy parę jednostek teksturujących. Ich ilość możemy pobrać za pomocą poniższej funkcji :

function ilosc_jt:integer; var i:integer; begin glGetIntegerv(GL_MAX_TEXTURES_UNITS_ARB,@i); result:=i; end;

Każda jednostka teksturująca może równolegle nakładać inną teksturę. Jednostki teksturujące mają identyfikatory od GL_TEXTURE0_ARB (pierwsza jednostka) az do GL_TEXTURE0_ARB+ilosc_jt-1 (ostatnia jednostka). Aby przełączyć się do jednostki teksturującej numer x należy wstawić poniższy kod :

glActiveTextureARB(GL_TEXTURE0_ARB+x-1);

Aby wyłączyć (włączyć) teksturowanie 2D w danej jednostce teksturującej należy się do niej przełączyć a następnie wykonać polecenie glDisable(GL_TEXTURE_2D) (lub glEnable(GL_TEXTURE_2D)). Podobnie polecenie glBindTexture odnosi się tylko do danej jednostki teksturującej. Odpowiednikiem polecenia glTexCoord2f jest polecenie glMultiTexCoord2fARB. Jego pierwszy parametr to identyfikator jednostki teksturującej do której odnosi się polecenie glMultiTexCoord2fARB a drugi i trzeci parametr ma takie samo znaczenie jak parametry w glTexCoord2f. Przykładowy kod nakładający dwie tekstury na trójkąt wyglądałby następująco :

procedure renderuj(tex1,tex2:gluint); begin // ustawienie teksturowania dla pierwszej jednostki glActiveTextureARB(GL_TEXTURE0_ARB); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D,tex1); // ustawienie teksturowania dla drugiej jednostki glActiveTextureARB(GL_TEXTURE0_ARB+1); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D,tex2); // renderujemy trojkąt glBegin(GL_TRIANGLES); glMultiTexCoord2fARB(GL_TEXTURE0_ARB,0,0); glMultiTexCoord2fARB(GL_TEXTURE0_ARB+1,0,0); glVertex3f(-10,-10,0); // pierwszy wierzchołek glMultiTexCoord2fARB(GL_TEXTURE0_ARB,1,0); glMultiTexCoord2fARB(GL_TEXTURE0_ARB+1,1,0); glVertex3f(10,-10,0); // drugi wierzchołek glMultiTexCoord2fARB(GL_TEXTURE0_ARB,0,1); glMultiTexCoord2fARB(GL_TEXTURE0_ARB+1,0,1); glVertex3f(10,10,0); // trzeci wierzchołek glEnd; // wyłączenie teksturowania dla obydwu jednostek glActiveTextureARB(GL_TEXTURE0_ARB); glDisable(GL_TEXTURE_2D); glActiveTextureARB(GL_TEXTURE0_ARB+1); glDisable(GL_TEXTURE_2D); end;

Wcześniej trzeba wygenerować dwie tekstury (za pomocą glGenTextures) i załadować do nich jakieś obrazki a następnie numery tych tekstur podać jako parametry procedurze renderuj. Procedurę renderuj należy oczywiście wrzucić do fragmentu kodu renderującego scenę OpenGL np. tak :

procedure renderujgl; begin glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); glLoadIdentity; gluLookAt(0,0,100,0,0,0,0,1,0); glColor3f(1,1,1); renderuj(tex1,tex2); glFlush; end;
Autor: halibut
[email protected]

Tekst dodał:
Adam Sawicki
09.04.2006 17:49

Ostatnia edycja:
Adam Sawicki
09.04.2006 17:49

Kategorie:

Aby edytować tekst, musisz się zalogować.

# Edytuj Porównaj Czas Autor Rozmiar
#1 edytuj 09.04.2006 17:49 Adam Sawicki 5.29 KB
Zwykły
Do sprawdzenia
Do akceptacji
  • Napisz komentarz:
    Aby dodać swój komentarz, musisz się zalogować.
Licencja Creative Commons

Warsztat używa plików cookies. | Copyright © 2006-2017 Warsztat · Kontakt · Regulamin i polityka prywatności
build #ff080b4740 (Tue Mar 25 11:39:28 CET 2014)