Multitexturing w OpenGL http://www.gamedev.pl/articles.php?x=view&id=162
Multitexturing w OpenGL
Parametry:
Dodany: 2006-04-09 przez !Reg
Autor: halibut
Opis: Wykorzystanie multitexturingu w OpenGL. Kod w Delphi.
Poziom:
Ocena: 24
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ózniej 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
1 z 2 2010-04-30 10:31
Multitexturing w OpenGL http://www.gamedev.pl/articles.php?x=view&id=162
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
pascalt@promail.pl
Komentarze (0)
2 z 2 2010-04-30 10:31
Wyszukiwarka
Podobne podstrony:
Multitexturing w OpenGLMultithreading csproj FileListAbsoluteopengl przeksztalcenia geometryczneMultiToolTipUIMultiTherm v23 inddmultitekMultithreadingAmbientTx csproj FileListAbsoluteMultiTableHeaderUIMultiTreeUIOpenGL narzędzie dla bardzo ambitnychGrafika komputerowa i OpenGLModelowanie oświetlenia w OpenGlopengl podstawyMultiTabbedPaneUIwięcej podobnych podstron