OpenGL uyumluluğu, adlandırma kuralları ve ARB vs EXT


14

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_objectuzantı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?

Yanıtlar:


9

Soru 1 - Genellikle EXT sürümü, iki veya daha fazla tedarikçi arasında işbirliği olarak gelir. ARB uzantıları, Khronos'un oy kullanan üyeleri arasında daha fazla tartışma gerektiriyor ve onaylanmadan önce EXT sürümünden değişiklik yapabilir. GL_EXT_direct_state_access ile karşılaştırıldığında birçok değişikliği olan GL_ARB_direct_state_access uzantısına bakın.

Soru 2 - GL_ARB_framebuffer_object uzantısının Sorunlar bölümünde, işlevlerin neden ARB sonekleri bulunmadığı belirtilmektedir:

(8) Bu uzantıdaki yeni belirteçlerin ve giriş noktalarının neden diğer ARB uzantıları gibi sonekleri yok?

   RESOLVED: Unlike most ARB extensions, this is a strict subset of
   functionality already approved in OpenGL 3.0. This extension
   exists only to support that functionality on older hardware that
   cannot implement a full OpenGL 3.0 driver. Since there are no
   possible behavior changes between the ARB extension and core
   features, source code compatibility is improved by not using
   suffixes on the extension.

Soru 3 - GL sürümü 3.0'dan küçük olan bir bağlamda framebuffer nesnelerini kullanmak istiyorsanız, uzantı dizesine bakmanız gerekir:

  1. GL_ARB_framebuffer_object destekleniyorsa, ARB olmayan işlevleri kullanın.
  2. Yalnızca GL_EXT_framebuffer_object destekleniyorsa, EXT işlevlerini kullanın.
  3. Her iki uzantı da desteklenmiyorsa, pbuffers gibi işletim sistemi düzeyinde ekran dışı gösterime geri dönmeniz gerekir.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.