Kompatibilitas OpenGL, konvensi penamaan dan ARB vs EXT

14

Saya pikir saya telah membentuk pemahaman umum tentang bagaimana konvensi dan ekstensi penamaan OpenGL bekerja, sampai saya menemukan sebuah kasus yang membingungkan saya.


Inilah pemahaman saya sejauh ini:

Tanpa akhiran - mis glGenBuffers(). Fungsi ini adalah bagian dari profil inti. The halaman wiki memberitahu saya bahwa ini telah ditambahkan ke profil inti mulai dari versi 1.5.

ARB - mis glGenBuffersARB(). Fungsi ini adalah bagian dari GL_ARB_vertex_buffer_objectekstensi standar . The spesifikasi dari ekstensi ini jelas menyatakan GenBuffersARB()dalam "Prosedur Baru dan Fungsi" bagian. Bagian "Ketergantungan" memberi tahu saya bahwa saya berpotensi mengakses ini dari konteks 1.4+, jika perangkat keras mendukung ekstensi.

EXT - Ini adalah ekstensi dan fungsi khusus vendor yang hanya didukung oleh beberapa vendor. Objek buffer vertex tampaknya tidak memiliki ekstensi EXT di registri.


Di sinilah pemahaman saya rusak:

glGenFramebuffers, seperti yang ditunjukkan wiki , ditambahkan ke inti pada 3.0.

Sekarang saya ingin mengakses fitur buffer bingkai pada versi profil inti yang lebih rendah dari 3.0. Jadi saya ingin menggunakannya sebagai ekstensi. Registri spesifikasi memberi tahu saya bahwa ada dua ekstensi yang tersedia - ARB dan EXT .

Pertanyaan 1 - Jika ekstensi ARB ada, mengapa ekstensi EXT ada? Tidakkah Anda selalu memilih yang terstandarisasi daripada yang khusus vendor?

Melihat spesifikasi ARB di bagian "Prosedur dan fungsi baru" memberi tahu saya bahwa ekstensi menentukan GenRenderbuffers()fungsi. Tidak ada akhiran ARB saat ini. GLEW sama sekali tidak memiliki prototipe fungsi glGenRenderbuffersARB(). Aneh.

Namun spesifikasi EXT memiliki GenRenderbuffersEXT()fungsi di bagian fungsi baru, dan GLEW juga memiliki glGenRenderbuffersEXT().

Pertanyaan 2 - Mengapa tidak ada akhiran ARB jika ada akhiran EXT? Bagaimana cara kerjanya untuk ARB, mengingat bahwa nama-nama fungsi ARB dan fungsi inti adalah sama?

Pertanyaan 3 - Saya akhirnya ingin fitur Framebuffer dari profil 1.4. Ekstensi mana dan set fungsi mana yang harus saya gunakan agar saya mendapatkan cakupan kompatibilitas perangkat keras maksimum?

ApoorvaJ
sumber

Jawaban:

9

Pertanyaan 1 - Biasanya versi EXT yang lebih dulu sebagai kolaborasi antara dua atau lebih vendor. Ekstensi ARB memerlukan lebih banyak diskusi di antara anggota pemungutan suara Khronos dan dapat memiliki perubahan dari versi EXT sebelum disetujui. Lihat ekstensi GL_ARB_direct_state_access yang memiliki banyak perubahan dibandingkan dengan GL_EXT_direct_state_access.

Pertanyaan 2 - Bagian Masalah pada ekstensi GL_ARB_framebuffer_object menyatakan mengapa fungsi tidak memiliki akhiran ARB:

(8) Mengapa token dan titik masuk baru dalam ekstensi ini tidak memiliki sufiks seperti ekstensi ARB lainnya?

   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.

Pertanyaan 3 - Jika Anda ingin menggunakan objek framebuffer pada konteks di mana versi GL kurang dari 3.0, Anda perlu melihat string ekstensi:

  1. Jika GL_ARB_framebuffer_object didukung, gunakan fungsi non-ARB.
  2. Jika hanya GL_EXT_framebuffer_object yang didukung, gunakan fungsi EXT.
  3. Jika tidak ada ekstensi yang didukung, Anda harus kembali ke rendering layar OS level seperti pbuffers.
Jason Allen
sumber