C dilini ve
OpenGL
teknolojisini kullanarak bir çizim penceresinin nasıl oluşturulacağını önceki
yazımızda ele almıştık. Bir OpenGL Penceresi Oluşturmak isimli yazımızda,
pencereyi oluştururken ve mesajları işlerken Windows API programlama yöntemini
tercih etmiştik. Bunun yanı sıra, pencere oluşturmak ve masajları işlemek gibi
işletim sistemine bağlı işlemleri gerçekleştiren birtakım araçlar olduğundan
söz etmiştik. Bu araçları kullanma yöntemini seçersek yazmamız gereken kod da
azalacaktır. Ayrıca bu gibi işlemler işletim sistemine bağlı olduğu için,
Windows
API programlama ile yaptığımız uygulama, bir anlamda işletim sistemine
bağımlıdır.
OpenGL kütüphanesi bu gibi bağımlılıkları aşıp, taşınabilir kodlar yazmayı
amaçlayan
bir kütüphanedir. Bu amacı gerçekleştirmek için de, işletim sistemine bağlı
işlemleri gerçekleştiren bazı araçlar geliştirilmiştir. OpenGL araç kiti
denilen,
GLUT olarak kısaltılan araç da bunlardan birisidir. GLUT, pencere oluşturma,
mesajları dinleme, klavye ve fare gibi dış araçlardan veri alma gibi
gereksinimleri
karşılayan bir araçtır. Bu yazımızda, GLUT aracının nasıl kullanılacağını ele
alacağız. Daha önce bahsetmiş olduğumuz, Jeff Burns tarafından geliştirilen
OpenGL sihirbazının nasıl kullanılacağı konusuna da değineceğiz.
Öncelikle GLUT
aracının, bize sunmuş olduğu fonksiyonlara bir göz atalım. Bu fonksiyonları,
platform bağımlı işlemleri gerçekleştirmek için kullanacağız.
void
glutInit(int *argc,char **argv); |
Bu
fonksiyon, GLUT kütüphanesini kullanıma başlatan fonksiyondur. GLUT
kütüphanesi
kullanılmaya başlanmadan önce mutlaka bu fonksiyon çağrılmalıdır.
Fonksiyon,
parametresini main fonksiyonunun parametrelerinden alır. |
int
glutCreateWindow(char *pencere_ismi); |
Üzerinde
çalışılan platformun pencere sisteminde, yeni bir pencere oluşturur.
Parametresi,
oluşturulan pencerenin ismidir. Geri dönüş değeri, oluşturulan pencerenin
numarasıdır. |
void
glutDisplayFunc(void (*Func)(void)); |
Oluşturulan
pencere üzerinde çizim işlemlerini yapan fonksiyonu parametre olarak alır
ve pencere yeniden çizildiğinde veya oluşturulduğunda bu fonksiyonu
çalıştırır.
|
void
glutMainLoop(); |
Programa
gelen olayların (events) dinlenmesini sağlar. Eğer gelen olay tanımlı bir
olay ise ona uygun bir fonksiyon çalıştırılır. |
void
glutInitWindowSize(int genislik,int yukseklik); |
Oluşturulan
pencerenin boyutlarına, parametre olarak geçilen değerleri atar. Ön
tanımlı
değer (300,300) değeridir. |
void
glutInitWindowPosition(int x,int y); |
Pencerenin,
ana ekranda konumlanacağı yeri ayarlar. Ön tanımlı değer (-1,-1)
değeridir.
|
* Olay
Tanımlama Fonksiyonları
void
glutIdleFunc(void(*Func)(void)); |
Hiçbir
olay olmadığı takdirde, kendisine parametre olarak geçilen fonksiyonun
çalıştırılmasını
sağlar. |
void
glutReshapeFunc(void (*Func)(int genislik,int yukseklik)); |
Pencere
yeniden boyutlandırıldığında, kendisine parametre olarak geçilen
fonksiyonun
çalıştırılmasını sağlar. |
* Klavye
İşlemlerini Yapan Fonksiyonlar :
void
glutKeyboardFunc(void(*Func)(char tus,int x,int y)); |
Klavyeden
bir tuşa basıldığında, kendisine parametre olarak geçilen fonksiyonun
çalıştırılmasını
sağlar. tus parametresi, klavyeden basılan tuşu, x ve y parametreleri
ise tuşa basıldığı andaki fare konumunun koordinatlarını belirtir.
|
void
glutSpecialFunc(void(*Func)(int tus,int x,int y)); |
Bu
fonksiyon, F tuşları için kullanılır. |
int
glutGetModifiers(); |
Klavyede
herhangi bir tuşa basılmış iken, CTRL-ALT-SHIFT tuşlarından birine basılıp
basılmadığını belirtir. Geri dönüş değeri basılan tuşu belirtir. Bu değer,
GLUT_ACTIVE_SHIFT, GLUT_ACTIVE_CTRL, GLUT_ACTIVE_ALT değerlerinden birisi
olabilir. |
* Fare
İşlemlerini Yapan Fonksiyonlar :
void
glutMouseFunc(void(*Func)(int tus,int durum,int x,int y)); |
Farenin
herhangi bir tuşuna basıldığında veya basılı olan bir tuş bırakıldığında,
kendisine parametre olarak geçilen fonksiyonu çalıştırır. tus
parametresi
farenin hangi tuşuna basıldığını belirtir. Bu parametre, GLUT_LEFT_BUTTON,
GLUT_RIGHT_BUTTON, GLUT_MIDDLE_BUTTON değerlerinden birisini alabilir.
Durum
parametresi tuşun durumunu belirtir. Tuş o anda ya basılıdır, ya da basılı
değildir. Bu parametre de GLUT_UP veya GLUT_DOWN değerlerinden birisini
alabilir. x ve y parametreleri ise farenin ekrandaki koordinatlarını
belirtir.
|
void
glutMotionFunc(void(*Func)(int x,int y)); |
Herhangi
bir tuş basılı olarak tutulup fare hareket ettirildiği zaman, kendisine
parametre olarak geçilen fonksiyonu çalıştırır. |
void
glutPassiveMotionFunc(void(*Func)(int x,int y)); |
Herhangi
bir tuşuna basılmaksızın fare hareket ettirildiği zaman, kendisine
parametre
olarak gönderilen fonksiyonu çalıştırır. |
void
glutEntryFunc(void (*Func)(int durum)); |
Fare
pencere sınırlarına girdiğinde veya pancere sınırlarından çıktığında,
kendisine
parametre olarak gönderilen fonksiyonu çalıştırır. Durum parametresi
pencere
sınırları içerisinde veya dışarısında olunduğu bilgisini verir. Bu
parametre
GLUT_ENTERED veya GLUT_LEFT değerlerinden birisini alabilir. |
GLUT kütüphanesi
daha birçok fonksiyon içermektedir. Bu fonksiyonlara ilişkin ayrıntılı
bilgilere
internetten ulaşabilirsiniz.
GLUT
kütüphanesini
kullanarak geliştirdiğimiz uygulama, önceki yazımızda incelediğimiz uygulamaye
benzer şekilde bir çizim penceresi oluşturuyor. Uygulama için Microsoft Visual
C++ 6.0ı kullandım. Uygulamayı sıfırdan oluşturmak için VC 6.0ı açıp
sırasıyla,
File-->New-->Projects-->Win32Application-->An Empty Project
komutlarını
verin. Derleyiciye GLUT ve OpenGL kütüphanelerini kullanacağımızı belirtmek
üzere Project-->Settings-->Link-->Object/Library Modules kutucuğuna
(opengl32.lib, glu32.lib, glut32.lib) isimlerini ekleyin. Artık projenizde
GLUT
ve OpenGL kütüphane fonksiyonlarını kullanabilirsiniz. Şimdi geliştirdiğimiz
uygulamayı adım adım inceleyelim. Öncelikle başlık dosyamızı kaynak kod
dosyamızın
başına ekleyelim :
DrawShape isimli
fonksiyonumuz, pencereyi oluşturduktan sonra bu pencere üzerinde çizim
işlemlerini
gerçekleştirecek olan fonksiyondur. Bu fonksiyonu glutDisplayFunc GLUT
kütüphane
fonksiyonuna parametre olarak geçeceğiz. Tüm çizim işlemleri bu fonksiyonda
yer alacaktır. Bu uygulamada boş bir çizim penceresi oluşturacağımız için
fonksiyonun
kodunda herhangi bir çizim ifadesi yer almamaktadır.
void
DrawShape(void)
{
    glClear(GL_COLOR_BUFFER_BIT);
    glFlush();
} |
DrawShape
fonksiyonu
sadece ekranı temizleyerek siyaha boyamaktadır. glClear ve glFlush
fonksiyonları
OpenGL kütüphanesine ait fonksiyonlardır. Henüz bir GLUT fonksiyonu
kullanmadık.
Şimdi uygulamamızın main fonksiyonunu inceleyelim :
int main(int
argc,char **argv)
{
    glutInit(&argc,argv);
    glutCreateWindow("GLUT kullanarak OpenGL penceresi
olusturmak");
    glutDisplayFunc(DrawShape);
    glutMainLoop();
    return 0;
} |
Main
fonksiyonumuzun
argümanları, glutInit GLUT kütüphanesi fonksiyonuna geçilmelidir. Bu
fonksiyon,
yukarıdaki tanımlamalardan hatırlayacağınız üzere GLUT kütüphanesini
kullanmaya
başlamadan önce mutlaka çağrılmalıdır. Bu çağrıdan sonra, bir pencere
oluşturan
glutCreateWindow GLUT kütüphane fonksiyonu çağrılıyor. Bu fonksiyonun
parametresi,
oluşturulan pencerenin başlığı olarak kullanılmaktadır. glutDisplayFunc GLUT
kütüphane fonksiyonuna yukarıda hazırlamış olduğumuz DrawShape fonksiyonu
parametre
olarak geçiliyor. DrawShape fonksiyonunda da oluşturulan pencere üzerinde
çizim
işlemleri yapılmaktadır. glutMainLoop GLUT kütüphane fonksiyonu da, sistemden
gelen mesajların dinlenmesi işlemini başlatmaktadır. Programı bu haliyle
çalıştırdığınız
takdirde ekranda şu görüntüyü görmelisiniz :
Programı komut
satırından bir komut satırı argümanı ile çalıştırarak, bu argümanı penceremize
başlık olarak atamak istiyorsak kodumuzu şu şekilde değiştirebiliriz
:
int main(int
argc,char **argv)
{
    if (argc != 2) {
       printf("Calistirma Bicimi : copengl2.exe
pencere_adi\n");
       return -1;
    }
    glutInit(&argc,argv);
    glutCreateWindow(argv[1]);
    glutDisplayFunc(DrawShape);
    glutMainLoop();
    return 0;
} |
Bu sayede,
programı
komut satırından çalıştırırken geçeceğimiz bir parametre pencere adı olarak
atanacaktır. Örneğin programı komut satırından copengl2.exe "GLUT Test
Uygulamasi" şeklinde çağırdığımızda karşımıza şu pencere çıkmalıdır :
Gördüğünüz gibi
GLUT kütüphanesini kullandığımızda yazdığımız kod miktarında dikkate değer bir
azalma oluyor. Çizim işlemleri için yine OpenGL kütüphanesindeki
fonksiyonlardan
yararlanılır. Önümüzdeki makalelerimizde bu konuya ayrıca değineceğiz.
Microsoft Visual
C++ 6.0 ile birlikte kullanabileceğiniz OpenGL sihirbazını internette MFC
OpenGL
AppWizard ismi ile arattırarak bulabilirsiniz. Sihirbaz Jeff Burns tarafından
geliştirilmiş ve değişiklikler göz önünde bulundurularak güncellenmektedir.
Bu sihirbazı VCnin ilgili klasörüne kopyaladıktan sonra VCyi açtığınızda ve
yeni bir projeye başlamak üzere File-->New komutlarını verdiğinizde
Projects
sekmesinde sihirbaza ilişkin birtakım seçenekler yer alacaktır : (Sihirbazla
birlikte Jeff Burns tarafından yazılan, sihirbazın nasıl kullanılacağını
ayrıntılı
bir şekilde anlatan bir dosya da bulunmaktadır. Bu dosyayı okuyarak bilgi
edinebilirsiniz.)
Örneğin buradan
MFC OpenGL AppWizard seçeneğini seçtiğinizde sihirbaz açılarak projeyi
oluşturmanızda
size yardımcı olacaktır. Bu araçları kullanmadan kod yazma yolu ile
yapabileceğimiz
bazı işlemler bu araçlarla otomatik hale getirilmiştir. Örneğin GLUT ile
sisteme
ilişkin işlemleri otomatik oalrak yapabiliyorduk. Bu sihirbazı kullanarak da
ekran görünümüne, derinlik ayarlarına, çözünürlüğe vb konulara ilişkin birçok
ayrıntıyı otomatik olarak yapabiliyoruz. Sihirbazı izleyerek adım adım tüm
seçenekleri
ayarladıktan sonra ilgili kod dosyaları sihirbaz tarafından bizim için
otomatik
olarak oluşturulmaktadır. Nu kaynak kod dosyaları üzerinde değişiklikler
yaparak
çeşitli uygulamalar da geliştirebiliriz. Sihirbazın adımlarında varsayılan
değerleri
değiştirmeden bir proje oluşturduğumuzda karşımıza şöyle bir ekran çıkmaktadır
:
Önümüzdeki
makalelerimizde
OpenGL ile çizim işlemlerini incelemeye devam edeceğiz. Hazırladığımız
uygulamayı
buradan
indirebilirsiniz. Herkese mutlu günler dilerim...
*
Kaynaklar
:
   - The OpenGL Utility Toolkit (GLUT) Programming Interface - API
Version 3
      Mark J. Kilgard
   - Visual C++ MFC openGL AppWizard,      
Jeff Burns
Makale:
C ve OpenGL : GLUT Kütüphanesinin Kullanımı C ve Sistem Programlama Çiğdem Çavdaroğlu
|