Giri�
Bu yaz�, OpenGL uygulamalar� i�in Mark Kilgard taraf�ndan
yaz�lm�� olan GL kullan�m elayg�ttak�m� (Utility Toolkit)
GLUT ile ilgili serinin devam�d�r. Daha �nceki yaz�m�zda
belirtti�imiz gibi (
Pencereler ve Canland�r�mlar)
GLUT, herhangi bir OpenGL geli�tiricisi i�in ilgin� ve kullan��l�
bir elayg�ttak�m�d�r. ��nk�, ta��nabilir d�zg� (code) yazman�za
olanak tan�r. GLUT, pencere y�netiminin ve GUI aray�z�n�n alt�nda
yatan pis ayr�nt�lar� geli�tiriciden gizler.
GLUT, bir kesim subAPI'lere b�l�nm��t�r. Bu ayki say�da
Pencereler Y�netimi subAPI'si betimlnecektir. Ad�ndan da
anla��ld��� �zere, OpenGL uygulaman�z taraf�ndan kullan�lan
pencereler ile ilgili g�revlere bakar. Bu ba�lamda, Yarat�m,
yokedim, pencere ikonu olusturumu; itim, pat diye ortaya ��kar�m,
gizlenim, hareket ettirim; ba�l�klar�n, bulunulan yerlerin
ayarlan�m�, vs..
Pencere Yonetimi Sub-Api'si
Burada GLUT'da pencerelerin y�netimi taraf�ndan desteklenen
fonksiyonlar�n tam bir dizelgesi (listesi) verilmektedir.
(S�r�m 3.6):
int glutCreateWindow(char *name) |
Yeni bir �st d�zey penceresi yarat�r. |
int glutCreateSubWindow(int win,
int x, int y, int width, int height) |
Bir alt pencere yarat�r. |
void glutSetWindow(int winId) |
O anki pencerenin winID'si (pencere kimli�i) bi�imindeki ID
(kimlik) ile pencereyi olu�turur. |
int glutGetWindow(void) |
O anki pencere i�in kimliklendirici ister. |
void glutDestroyWindow(int winId) |
WinId taraf�ndan belirtilen pencereyi yok eder. |
void glutPostRedisplay(void) |
O anki pencerenin yeniden g�r�nt�lenme icin gereksinimi olan
olay i�lemcisini GLUT'a s�yler. |
void glutSwapBuffers(void) |
O anki pencere i�in tampon b�lge de�i�toku�u yapar. |
void glutPositionWindow(int x, int y) |
Pencerenin konumunda de�i�iklik isteminde bulunur. |
void glutReshapeWindow(int width, int height) |
Pencerenin �l��lerinde de�i�iklik isteminde bulunur. |
void glutFullScreen() |
O anki pencerenin t�m ekran� kaplamas� isteminde bulunur. |
void glutPopWindow(void)
void glutPushWindow(void) |
O anki pencereyi y���ttaki di�er pencerelere g�re iter
veya �ste ��kar�r. |
void glutShowWindow(void)
void glutHideWindow(void)
void glutIconifyWindow(void) |
O anki pencereyi g�sterir, saklar veya ikonla�t�r�r. |
void glutSetWindowTitle(char *name)
void glutSetIconTitle(char *name) |
Penceredeki veya ikonla�t�r�lm�� penceredeki ba�l�k
�ubu�unu ayarlar. |
Alt Pencerelerin
Kullan�m�
Yukar}daki fonksiyonlar�n bir�o�unun kullan�m� olduk�a basittir.
Bunlardan baz�lar� ilk yaz�m�zda g�zden ge�irilmi�ti:
glutPostRedisplay, glutCreateWindow, glutPositionWindow,
glutSwapBuffers,..vs. Di�erleri yeni olmalar�na kar��n
kullan�m a��s�ndan �nemsizdirler ve glutSetIconTitle,
glutFullScreen, ...vs. hakk�nda yukar�daki a��klamalar
i�levleri konusunda yeterlidir. Fakat alt pencerelerin
kullan�mlar� o kadar da basit de�ildir. Bu y�zden size basit bir
�rnek vermeye ve onun kullan�m� i�in gerekli olan
ayr�nt�lar� k�saca tart��maya karar verdik.
A�a��da k���k bir OpenGL-GLUT �rnekg�sterimi (demo) icin kaynak
d�zg�s� (kodu) sunulmaktad�r. (../../common/March1998/example1.c,
../../common/March1998/Makefile). Bu �rnekg�sterimin amac� size:
(a) Bir alt pencerenin nas�l y�netilece�ini,
(b) Klavyenizin OpenGL uygulaman�z ile etkile�imli olarak nas�l
kullan�labilecegini,
(c) Bir OpenGL penceresinde bir metni nas�l g�r�nt�le�tirece�inizi
(render) g�stermektir.
(Tart��malar� izlerken ../../common/March1998/example1.c'nin kaynak d�zg�s�n�n ��kt�
olarak bir bi�imde elinizde olmas�n� lutfen �zen g�steriniz.)
�lk �nce main() fonksiyonuna bir g�z atal�m. Di�er GLUT
uygulamalar�nda oldu�u gibi ba�lang�� tan�mlamalar� ile ba�l�yor:
G�d�m sat�r� se�eneklerinin yaz�lmas�, g�r�nt� kipinin se�ilmesi,
�ncelikli pencerenin yerinin ve boyutunun ayarlanmas�.
Uygulamam�z�n birden �ok pencerenin y�netimine y�nelik olmasindan
dolay�, glutCreateWindow taraf�ndan verilen tamsay�
de�erli pencere kimlik (ID) numaras�n� depolamak �nemlidir.
winIdMain de�i�keni pencere tutama��d�r (handle).
Bundan sonra, winIdMain penceresi ile ilgili olaylar
i�n geri�a��r�m (callback) fonksiyonlar�n�n ayarlanmas�na s�ra gelir.
Bir�ok geri�a��r�m (callback) fonksiyonu tan�mlan�r ve t�m�
ana pencerede bir g�rev �stlenir: g�r�nt�y� �izen
(mainDisplay) g�r�nt� fonksiyonu, pencere �er�evelerinin
t�m d�n���mlerini y�neten (mainReshape) fonksiyonu,
klavye ve baska olaylar�n s�rada beklemedi�i zaman canland�r�m�
(animasyonu) y�neten bo�ako�um (idle) taraf�ndan ba�lat�lan
etkinlikleri y�neten klavye. (idle'nin rolunun daha
ayr�nt�l� anlat�m� i�in
Pencereler ve Canland�r�mlar b�l�m�ne bak�n�z.)
Bilinmesi gereken ilk �nemli konu, bir GLUT uygulamas�nda
yaln�zca bir tane bo�ako�an geri�a��r�m (callback)
fonksiyonu olabilece�idir. Uygulamada bo�ako�um (idle) fonksiyonu
t�m pencereler icin b�t�neyayg�nd�r (global). Bunu, idle()
fonksiyonlarin�z� bi�imlendirirken dikkate al�n�z. T�m pencerelerin
ve alt pencerelerin yenilenmesinde uygulaman�zda g�rev
almal�lard�r.
Program d�zg�s�unde (kodunda) bir alt pencerenin yarat�lmas�
gelir (winIDSub). Alt pencere yapmak i�in �st d�zey
pencereye bir kimlik (ID) sa�lamak gerekir. Bulunulan durumda
ilgili alt pencerenin winIDMain'in i� koordinatlar�na g�re
piksel t�r�nden x ve y koordinatlar� ve istenilen alt pencerenin
piksel t�r�nden y�kseklik ve geni�li�i kimlik olarak d���n�lebilir.
Alt pencereyi yaratt�ktan sonra GLUT program�m�za bir tutamak
(handle) g�nderir ve winIDSub i�in uygun geri�a��r�m
(callback) fonksiyonlar�n�n ayarlanmas� i�in haz�r duruma gelinir.
�rnekg�sterimimizde iki tane geri�a��r�m (callback) fonksiyonunun
ayar�n� yapmaktay�z: g�r�nt� (subDisplay) ve yeniden bi�imlendirme
(subReshape).
GLUT bir alt pencere a�t���nda, bunu t�m OpenGL �evre ko�ullar�
ile destekler. Alt pencerelerin kullan�m� s�ras�nda bir ba�ar�m
(performans) k�s�t� ortaya ��kar. ��nk�, grafik kart�n�n
s�r�c�s� pencereler aras� her ge�i�te bu pencereler i�in ayr�lm��
olan bellek alanlar�n� yenilemek zorundad�r. Her pencere ba��ms�z
OpenGL ko�ullar� sayesinde kendi koordinat sistemine sahiptir.
../../common/March1998/example1.c' de koordinat sistemleri s�ras�yla mainDisplay()
ve subDisplay()' da ayarlanm��t�r. �imdi bu iki g�r�nt�
fonksiyonunu kendiniz deneyebilirsiniz ve e�er Ocak ay�nda OpenGL
hakk�ndaki yaz�m�z� izlediyseniz (
"")
anlama konusunda bir sorun ��kmayacakt�r.
mainDisplay() fonksiyonu k��eleri k�rm�z�, ye�il ve mavi
renklerde bir ��gen �izer. OpenGL, k��eler aras�nda renkleri
inrepolasyonla �reterek �okgeni doldurur. ��geni g�r�nt�le�tirmeden
�nce d�nen bir �ekil izlenimi elde edebilmek i�in, ��genin z-ekseni
etraf�nda d�nmesini (pencere ekran�na dik olarak) sa\u glayan
glRotate deyimi eklenmi� ve d�nme a��s� (spin)
idle()' da yava��a artt�r�larak kullan�lm��t�r.
winIdSub'a e�lik eden g�r�nt� fonksiyonunda oldu�u
gibi s�re� �ok kestirmedir. �nce arka plan� gri bir renkle
temizler, sonra alt pencereye ye�il bir �evresels�n�r �izer
ve son olarak metni g�r�nt�le�tirir. GLUT altinda metin
g�r�nt�le�tirmenin nasil yap�ld��� daha sonra a��klanacakt�r.
Bu an icin, glRasterPos2f(x, y) ile metnin nereye
�izilece�inin ayarlar�n�n yapilabilece�ine, ve ayni zamanda,
kullan�lan x, y koordinatlar�n�n alt pencerenin koordinat
sistemine (subReshape()' de tan�mlanm��t�) g�re
verildi�ine dikkat �ekmek yeterlidir.
Alt pencere canland�r�mdan gelen veriler icin metin ortam�
olarak rol oynar. Bu aptalca bir uygulamad�r; metin ortam� ana
pencerede olu�turulabilir ve ayn� sonuca ba�ar�yla ula��labilirdi
(�stelik daha verimli bir �ekilde). Bununla beraber, Ozel
durumlarda metin ortam� i�in bir alt pencere a�mak bir anlam
kazanabilir. Ornegin, canland�r�m�n ���klar ve �evresel etkilerle
bezenmi� 3 boyutlu olmas� durumunda metin ortam�n� ���klar,
perspektif etkiler, g�lgelemeler ve sislerle bozmak
istemedi�inizde ge�erlidir. B�yle durumlarda alt pencere 3 boyutlu
canland�r�mdan b�t�n�yle ayr�ld��� i�in kullan��l� olur.
�st d�zey pencere ile alt pencere i�in kullan�lan yeniden
bi�imlendirme (reshape) geri�a��r�m (callback) fonksiyonlar�
aras�nda cok �nemli fark bulunmaktad�r. Bir yeniden
bi�imlendirme (reshape) olay� ba�lat�ld���nda yaln�zca �st
d�zey pencere yeniden bi�imlendirme geri�a��r�m fonksiyonu
(�rne�imizde mainReshape()) devreye sokulur.
subReshape yeniden bi�imlendirme geri�a��r�m fonksiyonu
mainReshape'in i�inden �a�r�lmal�d�r.
Bu durum, alt pencerelerin yerle�im ve bi�imlerinin �st d�zey
pencerenin b�y�kl�k ve bi�imiyle s�n�rland�r�lm�� olmas�ndan
dolay� etkilidir. Bu y�zden, e�er mainReshape() icin
program d�zg�s�n� (kodunu) okuyacak olursan�z, �nce �st d�zey
pencere i�in izd���m matrisini olu�turdu�umuzu, sonra da
winIDsub ile belirtilen alt pencereye �evrildi�ini ve
alt pencerenin yeniden bi�imlendirme fonksiyonunun
sonradan kullanmak istedi�imiz winIDMain'e g�re verilen
y�kseklik ve geni�lik ile beraber �a�r�ld�g�n� g�receksiniz.
OpenGL uygulamas�nda idle() geri�a��r�m fonksiyonunun
tum �st d�zey ve alt pencereleri g�ncellemesi gerekti�ini daha
�nce belirtmi�tik. �rne�imizde, idle() ilk once
canland�r�m durum de�i�kenlerini (time ve spin)
g�ncellemekte ve sonra hem ana hem de alt pencereyi yeniden
g�r�nt�lenmesi isteminde bulunmaktad�r.
Klavye
Programa iki tane etkin tu� eklenmi�tir. ("i" tu�una basarak
metin ortam�n� kapat�p a�abilirsiniz ve "q" tu�u ile uygulama
ortam�ndan ��kabilirsiniz. Deneyin, g�receksiniz :)
Klavyenizden bir tu�a her bast���n�zda GLUT'un olay i�lemci
s�r�c�s� bunu bir klavye olay� olarak yazma�lar. Bu olaylar klavye
geri�a��r�m (callback) fonksiyonlar� taraf�ndan y�netilir.
�lke olarak her pencere kendi geri�a��r�m fonksiyonuna sahiptir.
Fare (mouse) verilen bir pencere (veya alt pencere) i�indeki
(x, y) konumunda bulundu�unda ve bir klavye olayi ba�lat�ld���nda
o pencere ile ilgili olan klavye geri�a��r�m fonksiyonu devreye
sokulur. Bu geri�a��r�m fonksiyonu arg�manlar olarak tu�a ait
olan ASCII simgesini (imlenmemi� simge: unsigned char ve
imlecin o anki x, y konumunu al�r. ../../common/March1998/example2.c' de x, y icin bir
kullan�m sunulmamaktad�r ama, bu g�zel �zelli�in �st�nl�klerini
kendi uygulamalar�n�zda kullanacag�n�za eminim.
�rnekg�sterimimizde yaln�zca �st d�zey penceresi
klavye geri�a��r�m�na sahiptir. Eger, imle� alt pencere i�indeyken
"i" veya "q" tu�lar�na basarsan�z hi�bir �eyin olmad���n�
g�receksiniz. Benimsenmi� olarak, bir pencere yarat�ld���nda ve
hi� klavye geri�a��r�m� yazma�lanmad���nda (registered) t�m tu�
vuru�lar� g�zard� edilir. Bunu, ileride birden fazla pencere
kulland���n�zda ve klavyeyi etkinle�tirmek istedi�inizde
unutmaman�z gerekir.
Son olarak, glutKeyBoardFunc(). fonksiyonuna NULL
degeri atanarak klavye geri�a��r�mlar�n�n �retilmesinin
�nlenebilece�ini vurgulayabiliriz.
Metin G�r�nt�le�tirimi
OpenGL ve GLUT alt�nda metin olu�turma olana�i olduk�a
yetersizdir. Bunu s�yledi�im i�in �zg�n�m ama bu do�rudur.
OpenGL kitapl���nda metin olu�turman�n neden bu kadar
g�zard� edildi�inden tam olarak emin de�ilim. SGI'in eski
GL kitapl���n�n grafik kipinde metin olu�turmay� y�neten
birka� y�ksek d�zeyli fonksiyonu vard� ve ayr�ca ek olarak da
fontlar� de�i�tirmek i�in yard�mc� kitapl��� bulunmaktayd�.
OpenGL s�f�rbirharitas� olu�turmak i�in �ok ilkel
y�nergeleri destekler ve bunun anlam� her simge i�in
s�f�rbirharitalar�n� olu�turan kitapl��� ��z�n�rl��e,
fontlar�n �l�eklerine ve bu gibi �zeliklere dikkat ederek
kendinizin yapacak olmas�d�r.
GLUT, OpenGL ile metin kullan�m�ndaki ikilemi biraz da olsa
��zmektedir. O, yeri glRasterPos taraf�ndan tan�mlanan
tek bir simgeyi ekranda olu�turan glutBitmapCharacter'i
sa�lamaktad�r. katarlar� olustururken ya�am� kolayla�t�ran
drawString() ve drawStringBig() fonksiyon
ikilisi de ayr�ca eklenmi�tir.
Sonu�
Burada, GLUT alt pencerelerinin kullan�m�na �ok basit bir
giri� yap�lm�� bulunulmaktad�r. Bu anda, bunlarla denemeler
yapman�n ve de�i�ik �al��matabanlar�nda (platformlarda)
s�naman�n yararl� olacag�n� belirtirken vurgulanmas� gereken
nokta GLUT alt pencerelerinin, ne yaz�kki, her yerde tam etkin
olmad���d�r. 3Dfx tabanl� kartlar� bulunan kullan�c�lar donan�m
k�s�tlamalar�ndan dolayi alt pencerelerin kullan�m�n�n olmad���n�
goreceklerdir. Ayn� zamanda, baz� �zel �al��matabanlar�nda
(platformlarda) alt pencereleri kullan�rken b�y�k bir ba�ar�m
sorunu bulunmu�tu. �rne�in, 2Mb Matrox Millenium'lu bir Linux
Alpha altinda bir alt pencere kullan�m� uygulaman�n iki kat
yava� �al��mas�na sebep olmaktad�r. ��nk�, b�y�k olas�l�kla
Alpha i�in olan X sunucusu halen herhangi bir donan�m ivmesini
desteklememektedir. �te yandan, SGI'in OpenGL s�r�c�l� bir
2Mb ATI RageII'li Windows 95 alt�nda ayn� uygulama ola�an�st�
bir �ekilde �al��maktad�r.
Linux'un �ok h�zl� bir �ekilde geli�im g�stermesinden dolay�
yak�n bir gelecekte bu ba�ar�m sorunlar�n�n ve uyumsuzluklar�n
giderilmesi �ok olas�d�r. Bu an i�in bunlar�n fark�nda olup
�oklu pencere kullan�m�nda dikkatli olmak gerekmektedir.
Ku�kusuz, �st d�zey kullan�c�lar matris y���t� ile
oynayarak alt pencerelerin kullan�m� ile ilgili bir yol
bulabilirler ama bunu, hen�z calismamamizdan dolay�, sonraya
b�rakaca��m i�in beni ba���lay�n.. ;)).
|