Glfw Pencere Oluşturma İpuçları - Mustafa Sabri OĞUZ

Duyurular

20 Haziran 2014 Cuma

Glfw Pencere Oluşturma İpuçları

Glfw Window creation hints

Glfw kütüphanesinde, bir pencere veya OpenGL içeriği oluşturulmadan önce ayarlanabilir bazı ipuçları vardır. Bunlardan bazıları pencere özellikleriyle, bazıları ise framebuffer ve OpenGL içeriği (context) özellikleriyle ilgilidir.

glfwInit fonksiyonu ile kütüphaneyi başlattığımız anda pencere ipuçları, varsayılan değerleri atanmaktadır. Varsayılan pencere ipuçlarını, pencere oluşturulmadan önce glfwWindowHint fonksiyonu ile değiştirebilir, glfwDefaultWindowHints fonksiyonu ile varsayılan değerlere geri dönüş yapılır.

glfwWindowHint Fonksiyonu Nedir?

// Prototip Tanımı
void glfwWindowHint(int target, int hint);

// Kullanımı
glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
glfwWindowHint: Glfw penceresi oluşturulmadan önce pencere veya içerik özelliklerini değiştirmeye yarayan fonksiyondur.

Fonksiyon Parametreleri;
  • [in] int target - Değiştirilmesini istediğimiz pencere ipucu tanımı
  • [in] int hint- Pencere ipucunun alacağı yeni değer

glfwDefaultWindowHints Fonksiyonu Nedir?

// Prototip Tanımı
void glfwDefaultWindowHints(void);

// Kullanımı
glfwDefaultWindowHints();
glfwDefaultWindowHints: Değiştirilen pencere ipuçlarını varsayılan değerlerine geri dönüş yapmasına yarayan (sıfırlayan) fonksiyon.

glfwGetWindowAttrib Fonksiyonu Nedir?

// Prototip Tanımı
int glfwGetwindowAttrib(GLFWwindow *window, int attrib);

// Kullanımı
int ipUcu;
ipUcu = glfwGetwindowAttrib(window, GLFW_RESIZABLE);
glfwGetwindowAttrib: Oluşturulan pencere ve içeriğin gerçek özelliklerini öğrenmek için kullandığımız fonksiyon.

Fonksiyon Parametreleri;
  • [in] GLFWwindow *window - Pencere ipucu bilgisini alacağımız pencere nesnesi
  • [in] int attrib- Öğrenmek istediğimiz pencere oluşturma ipuçusu


Bu ipuçlarını yazımızın başında belirtiğimiz gibi 3'e ayrılmaktadır. Bunlar;
  1. Pencere ile ilgili ipuçları
  2. Framebuffer ile ilgili ipuçları
  3. OpenGL içeriği (context) ile ilgili ipuçları
Fakat bu ipuçlarını açıklamadan önce bazı kısıtlamalardan bahsetmem gerekiyor.

Sert ve Esnek Kısıtlamalar

Bazı pencere ipuçlarının sert kısıtlamaları vardır. Başarılı bir pencere ve OpenGL içeriği oluşturulması için mevcut özelliklerinin uyumlu olması gerekir. Örneğin: Ekran kartınızda OpenGL 3.2 arabimin versiyonuna sahip iken 3.2 üstü bir versiyonu seçmeye çalışmak, hataya sebep olur. Esnek kısıtlamalar ise pencerenin ve OpenGL içeriğin özellikleri isteneni sağlamasa bile uygun ipuçlarını otomatik olarak kendi belirleyebilir, ancak çıkan pencere ve içerik, istenen ipuçlarından farklı olabilir. Oluşturulan pencere ve içeriğin gerçek özelliklerini öğrenmek için, glfwGetWindowAttrib fonksiyonunu kullanabilirsiniz.

Aşağıdaki ipuçları sert kısıtlamalar şunlardır:
  •     GLFW_STEREO
  •     GLFW_CLIENT_API
OpenGL içeriği için sert kısıtlamalar şunlardır:
  •     GLFW_OPENGL_FORWARD_COMPAT
  •     GLFW_OPENGL_PROFILE
Eğer pencere veya OpenGL içeriği için verilen ipuçları değerleri geçerli değil ise yok sayılır.

Pencere ile ilgili ipuçları

GLFW_RESIZABLE: Pencerenin kullanıcı tarafından yeniden boyutlandırılabilir, olup olmayacağını belirtir. Pencere yeniden boyutlandırmaya kapalı olsa dahi glfwSetWindowSize fonksiyonu ile yeniden boyutlandırma yapabilirsiniz. Bu ipucu, tam ekranda oluşturulan pencerelerde yok sayılır.

GLFW_VISIBLE: Pencerenin başlangıçta görünür olup olmayacağını belirtir. Bu ipucu, tam ekranda oluşturulan pencerelerde yok sayılır.

GLFW_DECORATED: Pencerenin çerçevesinin olup olmayacağını belirtir.  Çerçevenin olmamasından kasıt, pencere başlığı, kapama, tam ekran, minimize butonlarının ve pencere kenarlarının olmaması anlamına gelmesidir.

Framebuffer ile ilgili ipuçları

GLFW_RED_BITS, GLFW_GREEN_BITS, GLFW_BLUE_BITS, GLFW_ALPHA_BITS, GLFW_DEPTH_BITS ve GLFW_STENCIL_BITS ipuçları varsayılan framebuffer'ın çeşitli bileşenlerini oluşturan özelliklerin bit derinliği belirlemeye yarar.

GLFW_ACCUM_RED_BITS, GLFW_ACCUM_GREEN_BITS, GLFW_ACCUM_BLUE_BITS ve GLFW_ACCUM_ALPHA_BITS ipuçları varsayılan ikincil (accumulation) framebuffer'ın çeşitli bileşenlerini oluşturan özelliklerin bit derinliği belirlemeye yarar.

GLFW_AUX_BUFFERS: kaç adet ikincil framebuffer olacağını belirlemeye yarar.

GLFW_STEREO: stereoskopik görüntü oluşturmayı belirtir.

GLFW_SAMPLES: multisampling tekniği ile anti-aliasing değerini belirlemeye yarar. Sıfır değeri girilirse multisampling devre dışı bırakır.

GLFW_SRGB_CAPABLE: Framebuffer'a sRGB modunun olup olmayacağını belirtmeye yarar.

GLFW_REFRESH_RATE: Tam ekran pencereler için istenen yenileme hızını belirtir. Sıfıra ayarlanırsa, mevcut en yüksek yenileme hızı kullanılacaktır. Bu ipucu, pencere modu pencerelerde yok sayılır.

OpenGL içeriği (context) ile ilgili ipuçları

GLFW_CLIENT_API: OpenGL içeriğin hangi arabirim tarafından oluşturulacağını belirler. Olası değerler GLFW_OPENGL_API ve GLFW_OPENGL_ES_API .

GLFW_CONTEXT_VERSION_MAJOR ve GLFW_CONTEXT_VERSION_MINOR ipuçları oluşturulan içeriğin, uyumlu OpenGL arabirim versiyonunu seçmeye yarar.

Yukarıda ki ipuçları OpenGL için sert kısıtlamalar değildir, glfwCreateWindow fonksiyonu ile oluşturduğunuz içerik OpenGL sürümü istenen olandan az ise yine başarısız olur. Glfw varsayılan olarak 1.0 versiyonunu kullanmaktadır. Fakat istediğiniz doğrultusunda 3.2 veya üzeri versiyonları kullanılabilinir.

Sürücünün desteklediği en yüksek içerik versiyonu elde etmek gibi bir şansımız bulunmamaktadır. Bu nedenle Glfw, 1.0 versiyonunu temel olarak sağlamaktadır.

OpenGL ES'de ise bazı sert kısıtlamalar vardır.

GLFW_OPENGL_FORWARD_COMPAT ipucusu ile OpenGL içerik versiyonunun ileriye uyumlu olup, olmayacağını belirleyebilirsin. Desteklenen OpenGL sürümü 3.0 veya üzerinde ise kullanılabilinir. Eğer başka bir arabirim talep edilirse, bu ipucu göz ardı edilir.

GLFW_OPENGL_DEBUG_CONTEXT ipucusu ile hata ve performans sorunlarının raporlamak için, bir hata ayıklama modunda OpenGL içeriği oluşturmaya yarar. Eğer başka bir arabirim talep edilirse, bu ipucu göz ardı edilir.

GLFW_OPENGL_PROFILE ipucusu ile hangi OpenGL profili ile içeriğin oluşturulacağını belirler.
Olası değerler;

  • GLFW_OPENGL_CORE_PROFILE
  • GLFW_OPENGL_COMPAT_PROFILE
  • GLFW_OPENGL_ANY_PROFILE

Eğer 3.2 versiyonundan düşük ve belirli bir profil seçmek istemiyorsan, GLFW_OPENGL_ANY_PROFILE değerini kullanabilirsin. Eğer başka bir arabirim talep edilirse, bu ipucu göz ardı edilir.

GLFW_CONTEXT_ROBUSTNESS ipucusu ile içerik tarafından kullanılacak sağlamlık stratejisini belirler. Kullanılabilecek değerler;

  • GLFW_NO_RESET_NOTIFICATION 
  • GLFW_LOSE_CONTEXT_ON_RESET
  • GLFW_NO_ROBUSTNESS 

Pencere oluşturma ipuçlarının varsayılan değeri ve kullanabileceğiniz değerleri aşağıdaki tablo'da görebilirsiniz.
İsimVarsayılan DeğerGirilebilecek Değerler
GLFW_RESIZABLE GL_TRUE GL_TRUE or GL_FALSE
GLFW_VISIBLE GL_TRUE GL_TRUE or GL_FALSE
GLFW_DECORATED GL_TRUE GL_TRUE or GL_FALSE
GLFW_RED_BITS 8 0 to INT_MAX
GLFW_GREEN_BITS 8 0 to INT_MAX
GLFW_BLUE_BITS 8 0 to INT_MAX
GLFW_ALPHA_BITS 8 0 to INT_MAX
GLFW_DEPTH_BITS 24 0 to INT_MAX
GLFW_STENCIL_BITS 8 0 to INT_MAX
GLFW_ACCUM_RED_BITS 0 0 to INT_MAX
GLFW_ACCUM_GREEN_BITS 0 0 to INT_MAX
GLFW_ACCUM_BLUE_BITS 0 0 to INT_MAX
GLFW_ACCUM_ALPHA_BITS 0 0 to INT_MAX
GLFW_AUX_BUFFERS 0 0 to INT_MAX
GLFW_SAMPLES 0 0 to INT_MAX
GLFW_REFRESH_RATE 0 0 to INT_MAX
GLFW_STEREO GL_FALSE GL_TRUE or GL_FALSE
GLFW_SRGB_CAPABLE GL_FALSE GL_TRUE or GL_FALSE
GLFW_CLIENT_API GLFW_OPENGL_API GLFW_OPENGL_API or GLFW_OPENGL_ES_API
GLFW_CONTEXT_VERSION_MAJOR 1 Seçilen OpenGL arabiriminin geçerli major versiyon numarası (OpenGL 3.2)
GLFW_CONTEXT_VERSION_MINOR 0 Seçilen OpenGL arabiriminin geçerli minör versiyon numarası (OpenGL 3.2)
GLFW_CONTEXT_ROBUSTNESS GLFW_NO_ROBUSTNESS GLFW_NO_ROBUSTNESS, GLFW_NO_RESET_NOTIFICATION or GLFW_LOSE_CONTEXT_ON_RESET
GLFW_OPENGL_FORWARD_COMPAT GL_FALSE GL_TRUE or GL_FALSE
GLFW_OPENGL_DEBUG_CONTEXT GL_FALSE GL_TRUE or GL_FALSE
GLFW_OPENGL_PROFILE GLFW_OPENGL_ANY_PROFILE GLFW_OPENGL_ANY_PROFILE, GLFW_OPENGL_COMPAT_PROFILE or GLFW_OPENGL_CORE_PROFILE

Örnek: Pencerenin yeniden boyutlandırma özelliğini kaldırma.
/* Glfw Kütüphane Başlatılıyor. */
// glfwInit = Kütüphane başlatma fonksiyonu...
if (glfwInit())
cout << "GLFW -> OK : Kutuphane basariyla baslatildi." << endl;
else{
cout << "GLFW -> HATA : Kutuphane baslatilamadi." << endl;
return -1;
}

// Glfw pencere oluşturma ipuçları
glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);

/* Pencere modunda, pencere oluşturuluyor */
// glfwCreateWindow = Pencere yaratma fonksiyonu.
window = glfwCreateWindow(WIDTH, HEIGHT, TITLE, NULL, NULL);
if (window)
cout << "GLFW -> OK : Pencere olusturuldu." << endl;
else{
cout << "GLFW -> HATA : Pencere olusturulamadi." << endl;
glfwTerminate();
return -1;
}

// glfwMakeContextCurrent = Pencere'ye varsayılan içerik tanımlanıyor.
glfwMakeContextCurrent(window);

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

Referans:
http://www.glfw.org/docs/latest/window.html#window_hints
http://www.glfw.org/docs/latest/group__window.html

2 yorum:

  1. Eline emeğine sağlık, cidden kalite dolu bir site :) Ancak pek kimse uğramıyor sanırım, sitede şu ana kadar hiç yorum atmış birini göremedim. Umarım hak ettiğin ilgiyi alırsın :)

    YanıtlayınSil
    Yanıtlar
    1. Yorumun için teşekkür ederim. Haklısın, sanırım bu tarz konular fazla kişinin ilgisini çekmiyor.

      Sil