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ıglfwWindowHint: Glfw penceresi oluşturulmadan önce pencere veya içerik özelliklerini değiştirmeye yarayan fonksiyondur.
void glfwWindowHint(int target, int hint);
// Kullanımı
glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
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ıglfwDefaultWindowHints: Değiştirilen pencere ipuçlarını varsayılan değerlerine geri dönüş yapmasına yarayan (sıfırlayan) fonksiyon.
void glfwDefaultWindowHints(void);
// Kullanımı
glfwDefaultWindowHints();
glfwGetWindowAttrib Fonksiyonu Nedir?
// Prototip TanımıglfwGetwindowAttrib: Oluşturulan pencere ve içeriğin gerçek özelliklerini öğrenmek için kullandığımız fonksiyon.
int glfwGetwindowAttrib(GLFWwindow *window, int attrib);
// Kullanımı
int ipUcu;
ipUcu = glfwGetwindowAttrib(window, GLFW_RESIZABLE);
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;
- Pencere ile ilgili ipuçları
- Framebuffer ile ilgili ipuçları
- 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
- GLFW_OPENGL_FORWARD_COMPAT
- GLFW_OPENGL_PROFILE
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.
İsim | Varsayılan Değer | Girilebilecek 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
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ıtlaSilYorumun için teşekkür ederim. Haklısın, sanırım bu tarz konular fazla kişinin ilgisini çekmiyor.
Sil