Warsztat - Programowanie gier komputerowych :: Multitexturing w OpenGL
Strona główna Forum Szukaj Lista użytkowników
Grupy
Zarejestruj Zaloguj
Artykuły
Kliknij na kategorię żeby dodać artykuł Szukaj
Programowanie gier » Artykuły » Grafika 3D [Wersja do
drukowania]
Multitexturing w OpenGL
Opis Wykorzystanie multitexturingu w OpenGL. Kod w
Delphi.
Autor halibut Data Czw 07 Paź, 2004 10:48 pm Typ ***
Słowa klucze
Kategoria Grafika 3D
Odsłony 385
Multitexturing w OpenGL
Wykorzystanie multitexturingu w OpenGL. Kod w Delphi.
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 pascalt@promail.pl
Skocz do: Wybierz forumWarsztat - Programowanie
gier komputerowych|--Szkółka| |--Szkółka -
języki| |--Szkółka - grafika| |--Szkółka -
inne|--Programowanie gier| |--Ogólnie|
|--Dźwięk| |--Sztuczna Inteligencja|
|--Inne|--Programowanie grafiki|
|--Programowanie grafiki| |--OpenGL|
|--DirectX|--Produkcja| |--Pomysły|
|--Projektowanie| |--Projekty| |--Grafika|
|--Ogłoszenia|--O czym innym| |--Konferencje,
spotkania| |--Warsztat| |--Aktualności|
|--Artykuły| |--Wykłady| |--Compo|
|--Lepperlandia|--Śmietnik| |--Z odrzutu
Powered by Knowledge Base, wGEric (C) 2002 PHPBB.com MOD
This script (Knowledge Base - MX Addon v. 1.03e) is modified
by Haplo
W1.5b (C) 2004
[admin: ayufan, g[R]eK, Goliatus, mikael_, Regedit]
Wszystkie czasy w strefie CET (Europa)
Powered by phpBB2 Plus 1.52 based on phpBB 2.0.10 © 2001, 2002 phpBB
Group :: FI Theme :: Mody i Podziękowania
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