Multitexturing w OpenGL


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 OpenGL
Multithreading csproj FileListAbsolute
opengl przeksztalcenia geometryczne
MultiToolTipUI
MultiTherm v23 indd
multitek
MultithreadingAmbientTx csproj FileListAbsolute
MultiTableHeaderUI
MultiTreeUI
OpenGL narzędzie dla bardzo ambitnych
Grafika komputerowa i OpenGL
Modelowanie oświetlenia w OpenGl
opengl podstawy
MultiTabbedPaneUI

więcej podobnych podstron