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
|