Beni şaşırtan bir davaya rastlayana kadar OpenGL adlandırma kurallarının ve uzantılarının nasıl çalıştığına dair genel bir anlayış oluşturduğumu sanıyordum.
İşte şimdiye kadarki anlayışım:
Sonek yok - ör glGenBuffers()
. Bu işlev çekirdek profilin bir parçasıdır. Wiki sayfası bu sürüm 1.5 başlayarak çekirdek profiline eklendi söylüyor.
ARB - örn glGenBuffersARB()
. Bu işlev standartlaştırılmış GL_ARB_vertex_buffer_object
uzantının bir parçasıdır . Spec bu uzantının açıkça beyan GenBuffersARB()
"Yeni Prosedürler ve Fonksiyonlar" bölümünde. "Bağımlılıklar" bölümü, donanım uzantıyı destekliyorsa, buna 1,4+ bağlamdan erişebileceğimi söyler.
EXT - Bunlar yalnızca satıcıların destekleyebileceği satıcıya özel uzantılar ve işlevlerdir. Vertex buffer nesnesinin kayıt defterinde EXT uzantısı yok gibi görünüyor.
Anladığım yer burada:
glGenFramebuffers
, wiki'nin gösterdiği gibi, 3.0'da çekirdeğe eklendi.
Şimdi, 3.0'dan daha düşük bir çekirdek profil sürümünde çerçeve arabelleği özelliklerine erişmek istiyorum. Bu yüzden bir uzantı olarak kullanmak istiyorum. Spec kayıt defteri bana iki kullanılabilir uzantı olduğunu söylüyor - ARB ve EXT .
Soru 1 - Bir ARB uzantısı varsa, neden bir EXT uzantısı var? Standartlaştırılmış olanı her zaman satıcıya özel olandan seçmez misiniz?
"Yeni prosedürler ve fonksiyonlar" bölümündeki ARB spesifikasyonuna bir bakış bana uzantının GenRenderbuffers()
fonksiyonu tanımladığını söylüyor . Bu sefer ARB soneki yok. GLEW'in hiçbir işlev prototipi yoktur glGenRenderbuffersARB()
. Tuhaf.
Bununla birlikte, EXT spesifikasyonunun GenRenderbuffersEXT()
yeni fonksiyonlar bölümünde bir işlevi vardır ve GLEW de vardır glGenRenderbuffersEXT()
.
Soru 2 - EXT soneki varsa neden ARB soneki yok? ARB işlevinin ve çekirdek işlevin adlarının aynı olduğu göz önüne alındığında, bu ARB için nasıl çalışır?
Soru 3 - Sonuç olarak Framebuffer özelliklerini 1.4 profilinden istiyorum. Maksimum donanım uyumluluğu kapsamını elde etmek için hangi uzantıyı ve hangi işlev kümesini kullanmalıyım?