Home Index Search Links About Us
[LinuxFocus Image]
[Navegation Bar]
  Duyumlar   Belgelikler   Kurulu�lar  ���tler  

GLUT Programlama: Pencereler ve Canland�r�mlar

Yazar: Miguel Angel Sepúlveda

�eviri: Emre Demiralp


Giri�

Ba�lat�mlar

Olay ��leme

Canland�r�m �rne�i



GLUT Yuvasayfas�
GLUT Yazar�
GLUT-3.6 kaynaklar�

Giri�

Tasar�msal nedenlerden dolay� OpenGL �zelliklerinde pencere ba��ml�l���ndan ka��n�lm��t�r. B�ylelikle olu�an aray�z ta��nabilir, veriyollar�yla bezenmi� bir 2 ve 3 boyutlu g�r�nt�le�tirme kitapl��� niteli�indedir. Pencere a�ma ve g�r�nt�le�tirme yerel pencere sistemine kalm�� bir konudur. OpenGL kitapl���, yerel sistemle, yard�mc� kitapl�klar arac�l���yla ileti�imde bulunur. S�zgelimi, GLX yard�mc� kitapl��� OpenGL ile X pencere sistemi aras�nda ileti�im sa�lar. 

OpenGL elayg�t tak�m� (GLUT: OpenGL Utility Toolkit), pencere sisteminden ba��ms�z OpenGL programlar� yazmak i�in ANSI C ve FORTRAN ba�lant�lar�ndan olu�ur. Bu yaz�l�m Mark J. Kilgard taraf�ndan yaz�lm�� olup OpenGL tan�mlamalar�nda a��k kalm�� olan b�y�k bir bo�lu�u �rtmektedir. Erek ortamdan (target platform) ba��ms�z olarak ortak bir pencere sistemi kullan�m�na olanak sa�lad��� i�in GLUT geli�tiricilerine ��kran borcumuz bulunmaktad�r.  

GLUT g�resel olarak k���k ve ��renmesi kolay bir yap�d�r. Tasar�m� iyi olup yazar� taraf�ndan �ok g�zel bir bilgi da�arc��� da haz�rlanm�� bulunmaktad�r. Bu nedenle, burada, Linux Focus'ta bir yaz� serisine ba�lamak pek de anlaml� g�z�kmeyebilir. Ciddi program geli�tirmek isteyenlere Mark'�n bilgi da�arc���n� okumalar�n� sal�k veririz. Burada, bu GLUT s�tununu yazmaktaki amac�m�z GLUT kitapl���n� ve onun kullan�m�n�, �rneklerle ad�m ad�m ve bu derginin OpenGL serisine yanda� bir okuma kayna�� olarak sunmakt�r. Bu yakla��m�n yararl� bir katk� sa�layaca��n� ve daha �ok say�da program yap�mc�s�n� OpenGL-Linux vagonuna binmeye itece�ini ummaktay�z. Yine de, Mark'�n bilgi da�arc���n� iyi bir kaynak olarak edinmenizde yarar bulunmaktad�r. 

GLUT API, OpenGL gibi, bir durum motorudur. Bunun anlam�, GLUT'un uygulaman�n �al��t�r�lmas� s�recinde etkin olan durum de�i�kenlerine sahip oldu�udur. GLUT motorunun ba�lang�� durumlar� bir �ok uygulamaya uyabilecek bi�imde se�ilmi�tir. Program, uygun g�rd�k�e, durum de�i�ken de�erlerini de�i�tirebilir. Herhangi bir GLUT fonksiyonunun uyar�lmas� durumunda, fonksiyonun etkimesi o andaki durum de�i�kenlerinin de�erlerine g�re ayarlan�r. GLUT fonksiyonlar� kolay yap�da olup yaln�zca bir ka� parametre al�rlar. Fonksiyonlardan genellikle g�sterici (pointer) d�nd�r�lmez ve fonksiyonlara g�nderilen g�stericiler ise yaln�zca katar ve ge�irgen olmayan fontlar i�in olanlarla k�s�tlanm��lard�r. 

GLUT fonksiyonlar�, i�levselliklerine g�re, bir ka� alt API'ye s�n�fland�r�labilirler: 

  • Ba�lat�m 
  • Ba�lang�� Olay ��lemesi 
  • Pencere ��letimi 
  • �rt�katman (overlay) ��letimi 
  • M�n� ��letimi 
  • Geri�a��r�� Kay�d� 
  • Renk �ndeksi, Renk Haritas� ��letimi 
  • Duruma Gerid�n�� 
  • Font G�r�nt�le�tirimi 
  • Geometric Bi�im G�r�nt�le�tirimi 
Bu yaz�da, basit bir OpenGL program�n� ba�latmak i�in gerekli olan ba�lat�m, pencere i�letimi, olay i�leme fonksiyonlar�ndan baz�lar�n� inceleyip anlamaya �al��aca��z. 

Ba�lat�mlar

GLUT kullanan t�m OPenGL programlar� GLUT durum motorunu ba�latacak bi�imde ba�lamal�d�rlar. GLUT ba�lat�m fonksiyonlar� glutInit- �nekine sahip olmal�d�rlar. Ana ba�lat�m yordam� glutInit'dir: 
Kullan�m 
  glutInit(int **argcp, char **argv); 
  argcp anaprogramdan, program�n d�zeltilmemi� argc de�i�kenine bir g�stericidir.D�nd�r�ld���nde argcp taraf�ndan g�sterilmekte olan argcp de�eri g�ncellenir. Bunun nedeni, glutInit fonksiyonunun, GLUT kitapl��� ile ilgili olan g�d�msat�r� se�eneklerini �ekip ��karmas�d�r. S�zgelimi, X pencere sistemi ortam�nda, X pencere sistemiyle ilgili se�eneklerden GLUT'la ba�lant�l� olanlar�n alg�lanmas� gibi
  argv program'�n, anaprogram i�in, d�zeltilmemi� argv de�i�kenidir.   

glutInit GLUT durum de�i�kenlerinin ba�lat�m�n� ve pencere sistemi ile bir oturum i�in ileti�imin sa�lanmas�n� �stlenir. glutInit'ten �nce ba�lat�lan bir ka� yordam varolup bunlar glutInit- �nekine sahiptirler. Bu yordamlar benimsenen pencere ba�lat�m durumunu ayarlamakta kullan�l�rlar.  S�zgelimi: 
Kullan�m 
  glutInitWindowPosition(int x, int **y); 
  glutInitWindowSize(int width, int **height); 
  x,y  = piksel t�r�nden pencerenin ekrandaki konumu (sol �st k��e)  
  width,height  piksel t�r�nden pencere en ve boyu. 

T�m OPenGL uygulamas�nda ka��n�lmaz olarak bulunan ba�ka bir ba�lat�m yordam�, (glutInitDisplayMode()) daha bulunmaktad�r: 
Kullan�m 
  glutInitDisplayMode(unsigned int mode); 
  mode g�sterim modu olup GLUT g�sterim modu bit maskelerinin bit t�r� bir OR'lamas�d�r. Olabilir bit maske de�erleri a�a��da verilmektedir 
GLUT_RGBA  Bir RGBA mode pencere se�er. Bu, ne GLUT_RGBA ne de GLUT_INDEX belirtilmedik�e, benimsenen de�er olarak kal�r. 
GLUT_RGB  GLUT_RGBA ile ayn�. 
GLUT_INDEX  Renk indeks pencere modunu se�er. GLUT_RGBA'ya bask�nd�r. 
GLUT_SINGLE  Tek bir tamponlu pencere se�er. Bu benimsenen yap�d�r. 
GLUT_DOUBLE  �ift tamponlanm�� bir pencere se�er. GLUT_SINGLE'a bask�nd�r. 
GLUT_ACCUM  Depolama tamponlu bir pencere se�er. 
GLUT_ALPHA  Renk tamponuna(lar�na) alfa bile�enli bir pencere se�er. 
GLUT_DEPTH  Derinlik tamponlu bir pencere se�er. 
GLUT_STENCIL  �r�nt� yedekleme tamponlu bir pencere se�er. 
GLUT_MULTISAMPLE  Multismapling destekli bir pencere se�er. 
GLUT_STEREO Bir stereo pencere se�er. 
GLUT_LUMINANCE "luminance" renk modelli bir stereo pencere se�er. 
E�er bu �zelliklerin baz�lar�na yabanc� iseniz dert etmeyin, �imdi ya da sonra, bunlardan s�zedece�iz. �imdi bir ka� �rnek �zerinde dural�m.  �nce, tek darbe g�r�nt�leme uygulamas� i�in basit bir ba�lat�m: 

#include <GL/glut.h> 

void main(int argcp, char **argv){ 

/* Set window size and location */ 
glutInitWindowSize(640, 480); 
glutInitWindowPosition(0, 0); 

/* Select type of Display mode:  
   Single buffer & RGBA color */ 
glutInitDisplayMode(GLUT_RGBA | GLUT_SINGLE); 

/* Initialize GLUT state */ 
glutInit(&argcp, argv);  

.....more code 

}; 

�kinci olarak bir canland�r�m program�: 

#include <GL/glut.h> 

void main(int argcp, char **argv){ 

/* Set window size and location */ 
glutInitWindowSize(640, 480); 
glutInitWindowPosition(0, 0); 

/* Select type of Display mode: 
   Double buffer & RGBA color */ 
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE); 

/* Initialize GLUT state */ 
glutInit(&argcp, argv);  

.....more code 

}; 

Bu iki �rne�e, GLUT hakk�nda daha �ok �ey ��rendik�e geri d�nece�iz. Bu ikisi aras�ndaki ana ayr�l�k, ikinci �rnekte g�sterimin bir �ift tampon modunda ba�lat�m�d�r. Bu durum canland�r�mlar i�in idealdir, ��nk� bu yap� canland�r�m s�recindeki k�rp��malar� ortadan kald�r�r. 

Olay ��leme

Yukar�da s�zedildi�i gibi, GLUT bir durum motorudur. �imdi de onun olay geli�tiren bir motor olarak da tasarland���n� ��renece�iz. Bunun anlam�, bir saya�'�n ya da s�rekli bir d�ng�n�n uygun ba�lat�mlar sonras�nda devreye gir�di�idir. Bunlar, GLUT'a belirtimi yap�lan t�m olay ve s�re�lerin ba�lat�lmas�n� sa�larlar. Olaylar �unlard�r: t�klat�lan bir fare, kapat�lan bir pencere, bir pencerenin yeniden bi�imlendirilmesi, imle� hareketi, bas�lan klavye tu�lar�, ve daha da ilginci, hi�bir�eyin olmad��� bo� olay. Olas� olaylar�n her biri GLUT saya� ya da olay geli�tirme d�ng�s�n�n de�i�kenlerinden birine kaydedilmelidir. B�ylece, bu olaylar�n tetiklenip tetiklenmedi�i s�rekli denetlenebilir duruma gelmi� olur. 
 
S�zgelimi, "fareyi t�klat"� bir olay olarak GLUT'a kaydedip g�zlemleyebiliriz. Olaylar geri�a��r�� kay�t yordamlar�yla kaydedilirler. T�m�nde yaz�mkural� glut[someEvent]Func bi�imindedir. Fare t�klama durumunda bu glutMouseFunc bi�iminde olacakt�r. Bir geri�a��r�� kayd� GLUT motoruna hangi kullan�c� tan�ml� fonksiyonun olay�n tetiklenmesi durumunda �a��r�laca��n� s�yler. Dolay�s�yla, farenin sol (ya da sa�,..) tu�u t�klat�ld���nda ne yap�laca��n� tan�mlayan MyMouse adl� kendi yordam�m� yazacak olursam o zaman geri�a��r�� fonksiyonumu main() i�inde glutInit() sonras�nda "glutMouseFunc(MyMouse);" deyimini kullanarak kaydedebilirim. 

GLUT i�inde hangi geri�a��rma fonksiyonlar�na ve olaylara olanak sa�land���n� daha sonraya b�rakal�m. Bu anda �nemli olan nokta uygulamam�zdaki t�m �nemli olaylar kaydedildikten sonra GLUT'un olay i�leme yordam� olan glutMainLoop()'un uyar�lmas�d�r. Bu fonksiyonun geri d�n��� yoktur, program�m�z temelde sonsuz bir d�ng�ye girer. Bu d�ng� gerekli olan �nceden kay�tl� geri�a��rma fonksiyonlar� �a��r�r. T�m OpenGL uygulamal� main() fonksiyonlar�, bu nedenle, bir glutMainLoop() deyimi ile sona ermelidir. Dolay�s�yla, bizim canland�r�m �ablonumuzda: 

#include <GL/glut.h> 

void main(int argcp, char **argv){ 

/* Initialize GLUT state */ 
glutInit(&argcp, argv);  
glutInitWindowSize(640, 480); 
glutInitWindowPosition(0, 0); 

/* Open a window */ 
glutCreateWindow("My OpenGL Application"); 

/* Select type of Display mode:  
   Double buffer & RGBA color */ 
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE); 
 

/* Register Callback Functions */ 
..... 

/* Start Event Processing Engine */ 
glutMainLoop(); 
}; 

G�r�ld��� gibi, uygulamaya �nceden s�z� edilmeyen fazladan kod eklemi� bulunmaktay�m. Bu, glutCreateWindow(char **name), GLUT'un pencere i�letim yordamlar�ndan biridir. Bu, i�te, OpenGL & GLUT tasar�m felsefesinin en �ok ho�uma giden bir yan�d�r. Yaln�zca ad�na bakarak yordam�n ne yapt��� hakk�nda bilgi edinmek m�mk�nd�r!. Ayr�ca, tabandaki pencere sistemine OpenGL uygulamam�z i�in pencere a�t�rma g�d�m�n� de g�nderebilmektedir. A��lacak pencere bir katar ile aktar�lan ada sahip olacakt�r. X pencere sisteminde bu ad pencerenin sol �st k��esine yaz�lacakt�r. GLUT'un pencere i�letim b�l�m� inceleyece�imiz daha bir �ok fonksiyon bar�nd�rmaktad�r. Bu an i�in burada verilen yeterlidir. �te yandan, burada ba�lat�m yordamlar�n� onlar�n glutInit()'den sonra da yerle�tirilebilece�ini g�stermek �zere yeniden d�zenlemi� bulunmaktay�m. 

Olaylara d�nelim... �imdi, t�m canland�r�m programlar� i�in �ok temel olan iki geri �a��rma kay�t fonksiyonundan s�zetmek istiyorum. Bunlar g�sterim fonksiyonunu varolan pencere i�in d�zenleyen glutDisplayFunc ve bo� geri�a��rma'lar� d�zenleyen glutIdleFunc fonksiyonlar�d�r. Her iki kay�t fonksiyonu da void *(void) t�r� birer fonksiyondurlar. Diyelim ki canland�r�m �ablonumuz i�in iki tane ek geri�a��rma fonksiyonu yaz�yoruz. Bunlar, g�r�nt�m�z� pencere �zerine �izen OpenGL y�nermelerini devreye sokan void MyDisplay(void) ve kullan�c�dan herhangi bir veri giri�i olmad���nda �a�r�lan, yani GLUT'un olay i�leme makinas� sonsuz d�ng�de (glutMainLoop()) ilerlerken tetiklenmi� bir olay bulamad���nda devreye sokulan, void MyIdle(void) fonksiyonlar� olarak d���n�lebilirler. Bir canland�r�m program�nda neden bir Bo� geri�a��rma fonksiyonu kayd�na gereksinim duyuyorum dersiniz? Yan�t ��yledir: ��nk�, canland�r�m s�resince g�sterilen, g�r�nt�lerin (�er�evelerin) her birini, kullan�c�dan gelecek verilerden ba��ms�z olarak d�zeltmek istersem OpenGL program�n�n �al��t�r�lmas� s�resince s�k s�k �a�r�larak �er�eveleri MyDisplay() �izilmelerinden �nce de�i�tirebilen bir fonksiyon (bo� geri�a��rma) fonksiyonu varolmal�d�r.  

Canland�r�m �rne�i

Sonu�ta, i�te, canland�r�m i�in basit bir �ablon: 
#include <GL/glut.h> 

void MyIdle(void){ 
/* Some code to modify the variables defining next frame */ 
.... 
}; 

void MyDisplay(void){ 
/* Some OpenGL code that draws a frame */ 
.... 
/* After drawing the frame we swap the buffers */ 
glutSwapBuffers(); 
}; 

void main(int argcp, char **argv){ 

/* Initialize GLUT state */ 
glutInit(&argcp, argv);  
glutInitWindowSize(640, 480); 
glutInitWindowPosition(0, 0); 

/* Open a window */ 
glutCreateWindow("My OpenGL Application"); 

/* Select type of Display mode:  
   Double buffer & RGBA color */ 
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE); 

/* Register Callback Functions */ 
glutDisplayFunc(MyDisplay) 
glutIdleFunc(MyIdle) 

/* Start Event Processing Engine */ 
glutMainLoop(); 
}; 

G�rd���n�z gibi MyDisplay sonuna yeni bir GLUT yordam�, glutSwapBuffers(), eklemi� bulunmaktay�m. Bu, canland�r�mlarda �ok yararl�d�r. Burada, bir g�sterilen di�eri gizlenen, �ift tampon modunda pencere kullan�yoruz. Bu durumda OpenGL y�nermelerinin g�r�nt�lenmesi daima gizli tampon i�ine yap�l�r. glutSwapBuffers, �a�r�ld���nda, tamponlar� de�i�toku� ederek �izileni pencere i�inde g�r�nt�ler. Bu teknik, bilgisayar canland�r�mlar�nda, �er�eve i�eri�inin sat�r sat�r olu�turumunu insan g�z�nden saklamas� nedeniyle, genellikle ye�lenir. 

Art�k, OpenGL uygulamalar�n� yazmaya ba�lamak i�in yeterince malzeme elimizde bulunmaktad�r. Eksik olan tek �ey MyDisplay() i�indeki, ger�ekte �izimi ger�ekle�tiren, OpenGL y�nermeleridir... ama bu da ba�ka bir �yk�d�r.;-). 

GLUT programlama �zerine olan gelecek yaz�da, GLUT'un Pencere ��letimi b�l�m�nde bize sa�lanan i�levsellik �zerinde daha derinlemesine duracak ve ayn� pencerede �ok say�da g�r�nt� olu�turumu �zerinde duraca��z. Ayr�ca, ta��nabilirliklerini vurgulayarak pro'lar ve con'lar� da i�ererek, m�n�lerin kullan�m�n� da g�rece�iz


Daha �ok bilgi i�in:
© 1998 Miguel Angel Sepulveda
Bu sanal y�renin bak�m� Miguel A Sepulveda taraf�ndan yap�lmaktad�r..