Glfw ile Pencere Oluşturmak - Mustafa Sabri OĞUZ

Duyurular

31 Mart 2014 Pazartesi

Glfw ile Pencere Oluşturmak

Glfw ile kodunuz da hiçbir değişiklik yapmadan, Windows ve Linux işletim sistemlerinde çalışacak basit bir pencere yapalım.

#include <GLFW/glfw3.h>
#include <iostream>

using namespace std;
"main.cpp" dosyamıza program için temel olarak gerekli başlık (h, header) dosyalarını projemize dahil etmekle başlayalım. Eklediğimiz kodları satır satır olarak sırayla açıklamaya çalışayım.

1. satır; Glfw kütüphanesini programa dahil ediyoruz. Böylece Glfw ve OpenGL fonksiyonlarını kullanabileceğiz. (OpenGL kütüphanesi, glfw3.h başlık içinde include edilmiş, olduğundan tekrar include etmenize gerek yoktur.)
2. satır; Öğrenme maksadıyla kullandığımız konsol penceresine gerekli girdi & çıktı (input & output) fonksiyonlarını eklemiş olduk. Böylece kodumuzda neler olup bittiğini takip edebiliriz.
4. satır; Std kütüphanesi aşırı yükleme fonksiyonlarını (overloading functions) kısaltma maksadıyla tanımlamış olduk. Böylece her cout, cin, endl ..vs fonksiyonları için std::cout şeklinde uzun uzun yazmak zorunda kalmamış olacağız.

Std kütüphanesi kullanım örneği :
// Normalde
std::cout << "Merhaba Dünya" << std::endl;

// Kısaltma sayesinde
using namespace std;

cout << "Merhaba Dünya" << endl;

Başlık dosyalarını tanımladıktan sonra;
int main(void)
{
Her program için standart olan main fonksiyonumuzu tanımlıyoruz.

GLFWwindow* window;
Oluşturacağımız her pencere için gerekli bilgileri tutacak, GLFWwindow yapı (struct) türünden bir gösterici (pointer) nesne tanımlamak zorundayız.

Resmi dökümanlarda GLFWwindow yapı türü hakkında fazla bilgi verilmemiş, Kısaca açıklamak gerekirse; Id, başlık, genişlik ve yükseklik gibi pencere bilgilerini tutan bir kalıp.

 if (glfwInit())
cout << "GLFW -> OK : Kutuphane basariyla baslatildi." << endl;
else{
cout << "GLFW -> HATA : Kutuphane baslatilamadi." << endl;
return -1;
}
glfwInit: Glfw kütüphanesinin kullanımı için gerekli ilk değerleri atayan (kurulumu yapan, başlatan) fonksiyon diyebiliriz. Glfw fonksiyonlarını kullanmadan önce mutlaka tanımlanmış olması gerekir. Aksi halde hata mesajı alırsınız.

Not: Proje sonunda Glfw kütüphanesini, glfwTerminate() fonksiyonu ile sonlandırmaya dikkat ediniz.

Yukarıda ki örneğimizde; fonksiyonu test ederek, sonucu konsol penceremize yazdırıyoruz. Böylece fonksiyondan kaynaklanabilecek hataları tespit edebiliriz.

window = glfwCreateWindow(640, 480, "Game2Lab : GLFW_Deneme Projesi", NULL, NULL);
if (window)
cout << "GLFW -> OK : Pencere olusturuldu." << endl;
else{
cout << "GLFW -> HATA : Pencere olusturulamadi." << endl;
glfwTerminate();
return -1;
}
glfwCreateWindow: İşletim sistemlerinde pencere oluşturmaya yarayan fonksiyondur. Her 3D Grafik uygulamasında tanımlanması gereklidir.
Fonksiyon Parametreleri:
  • int width - Genişlik, ekran üzerinde ki genişliğini belirler. 0'dan büyük bir değer almak zorundadır.
  • int height - Yükseklik,  ekran üzerinde ki yüksekliği belirler. 0'dan büyük bir değer almak zorundadır.
  • const char * title - Pencere Başlığı, utf-8 karakter setini desteklemektedir.(Eğer IDE'niz destekliyorsa.)
  • GLFWmonitor *monitor - Monitor ID'ye göre pencereyi Tam ekran (Fullscreen) yada NULL ile pencere modu tanımlayabilirsiniz.
  • GLFWwindow *share - Pencere içeriğini diğer kaynaklarla paylaşmak
Not : GLFWmonitor ve share hakkında fazla bilgim ve pratiğim yok, bunlar için gelecek de kapsamlı yazı yazmayı düşünüyorum.

glfwMakeContextCurrent(window);
glfwMakeContextCurrent: Bu fonksiyon içerik için tahsis edilen iş parçacığını (thread), oluşturduğumuz pencereyle bağlantısını kurar. Fonksiyon her bağlantıda bir iş parçacığı kullanabilir. glfwCreateWindow() fonksiyonundan sonra tanımlanması gerekmektedir.
Fonksiyon Parametresi :
  • GLFWwindow *window - Önceden oluşturduğumuz ve kullanacağımız pencere nesnesi
while (!glfwWindowShouldClose(window))
{
/* Render Alani */

/* glfwSwapBuffers = Pencere içeriğindeki
ön ve arka bufferı değiştiren fonksiyon */
glfwSwapBuffers(window);

/* Pencere ve işlem mesajlarını,
mesaj kuyruğuna alan fonksiyon */
glfwPollEvents();
}
Bu kodda uygulamanın sonlanmaması ve değişen değerleri, işleme sokmak için bir döngü tanımladık. Pencere varlığını koruduğu sürece döngü çalışmaya devam edecektir.

glfwWindowShouldClose: "Eğer pencere kapanmışsa" anlamını taşıyan fonksiyon. Kullanıcı pencereyi kendi isteğiyle sonlandırdığında geri dönüş(return) değeri "TRUE" olarak döner.
Fonksiyon Parametresi :
  • GLFWwindow *window - Önceden oluşturduğumuz ve kullanacağımız pencere nesnesi
 /* Render Alani */: Bu yorum satırı altına OpenGL ile oluşturacağımız içeriğin, komutlarının yazılacağı kısım.

glfwSwapBuffers: Ön tamponu (front buffer) ve arka tamponla (back buffer) yer değiştiren fonksiyon. Bu açıklama ileri ki zamanlarda OpenGL dersleri ile daha da detaylandırılacak.
Fonksiyon Parametresi :
  • GLFWwindow *window - Önceden oluşturduğumuz ve kullanacağımız pencere nesnesi
glfwPollEvents: Pencere ve girdi mesajlarını işleme sokan fonksiyon.

    // Pencere nesnesi sonlandırılıyor.
glfwDestroyWindow(window);

// Glfw Kütüphane Sonlandırılıyor.
glfwTerminate();
return 0;
Son kodda, Pencere nesnesini sonlandırmak, glfwInit() fonksiyonu ile oluşturulan değerleri silmek ve programın başarılı bir şekilde sonuçlandığını ifade ediyoruz.

glfwDestroyWindow: Bu fonksiyon pencere nesnesini ve içeriği sonlandırmaktadır. Bu fonksiyon tanımlandık dan sonra geriçağrım (callback) fonksiyonları çalışmayacaktır.
Fonksiyon Parametresi :
  • GLFWwindow *window - Önceden oluşturduğumuz ve kullanacağımız pencere nesnesi

glfwTerminate: glfwInit() fonksiyonunun tersi işlem görmektedir. Sonlanan programın sistem hafızası (memory) üzerinde kalan nesne(leri) sonlandıran fonksiyon. Böylece sistem hafızasında ayrılan yeri, sisteme geri iade etmektedir.

Bitbucket: main.cpp dosyasını indirmek için tıklayın.

Referans:
http://www.glfw.org/documentation.html

1 yorum: