Kompatybilność z OpenGL, konwencje nazewnictwa i ARB vs EXT

14

Myślałem, że zrozumiałem, jak działają konwencje nazewnictwa i rozszerzenia OpenGL, dopóki nie natknąłem się na przypadek, który mnie pomieszał.


Oto moje dotychczasowe zrozumienie:

Bez przyrostka - np glGenBuffers(). Ta funkcja jest częścią podstawowego profilu. Strona wiki mówi mi, że został on dodany do profilu podstawowego począwszy od wersji 1.5.

ARB - np glGenBuffersARB(). Ta funkcja jest częścią znormalizowanego GL_ARB_vertex_buffer_objectrozszerzenia. Spec tego rozszerzenia wyraźnie deklaruje GenBuffersARB()w sekcji „Nowe procedury i funkcje”. Sekcja „Zależności” mówi mi, że mogę uzyskać do niej dostęp z kontekstu 1.4+, jeśli sprzęt obsługuje rozszerzenie.

EXT - są to rozszerzenia i funkcje specyficzne dla dostawców, które mogą obsługiwać tylko niektórzy dostawcy. Obiekt bufora wierzchołków nie wydaje się mieć rozszerzenia EXT w rejestrze.


Oto, gdzie moje zrozumienie się psuje:

glGenFramebuffers, jak pokazuje wiki , został dodany do rdzenia w 3.0.

Teraz chcę uzyskać dostęp do funkcji bufora ramki w wersji profilu niższego rdzenia niż 3.0. Chcę więc użyć go jako rozszerzenia. Rejestr specyfikacji mówi mi, że dostępne są dwa rozszerzenia - ARB i EXT .

Pytanie 1 - Jeśli istnieje rozszerzenie ARB, dlaczego istnieje rozszerzenie EXT? Czy nie zawsze wybierałbyś znormalizowany zamiast specyficznego dla dostawcy?

Spojrzenie na specyfikację ARB w sekcji „Nowe procedury i funkcje” mówi mi, że rozszerzenie definiuje GenRenderbuffers()funkcję. Tym razem brak przyrostka ARB. GLEW wcale nie ma prototypu funkcji glGenRenderbuffersARB(). Dziwne.

Specyfikacja EXT ma jednak GenRenderbuffersEXT()funkcję w sekcji nowych funkcji, a także GLEW glGenRenderbuffersEXT().

Pytanie 2 - Dlaczego nie ma przyrostka ARB, jeśli istnieje przyrostek EXT? Jak to działa dla ARB, biorąc pod uwagę, że nazwy funkcji ARB i funkcji podstawowej są takie same?

Pytanie 3 - Ostatecznie chcę, aby funkcje Framebuffer pochodziły z profilu 1.4. Jakiego rozszerzenia i zestawu funkcji powinienem użyć, aby uzyskać maksymalny zasięg kompatybilności sprzętowej?

ApoorvaJ
źródło

Odpowiedzi:

9

Pytanie 1 - Zazwyczaj wersja EXT jest najważniejsza jako współpraca dwóch lub więcej dostawców. Rozszerzenia ARB wymagają więcej dyskusji między głosującymi członkami Khronos i mogą mieć zmiany w stosunku do wersji EXT, zanim zostaną zatwierdzone. Zobacz rozszerzenie GL_ARB_direct_state_access, które ma wiele zmian w porównaniu do GL_EXT_direct_state_access.

Pytanie 2 - sekcja Problemy rozszerzenia GL_ARB_framebuffer_object określa, dlaczego funkcje nie mają przyrostków ARB:

(8) Dlaczego nowe tokeny i punkty wejścia w tym rozszerzeniu nie mają sufiksów jak inne rozszerzenia ARB?

   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.

Pytanie 3 - Jeśli chcesz użyć obiektów bufora ramki w kontekście, w którym wersja GL jest mniejsza niż 3.0, musisz spojrzeć na ciąg rozszerzenia:

  1. Jeśli obsługiwany jest obiekt GL_ARB_framebuffer_object, użyj funkcji innych niż ARB.
  2. Jeśli obsługiwany jest tylko obiekt GL_EXT_framebuffer_object, użyj funkcji EXT.
  3. Jeśli żadne z tych rozszerzeń nie jest obsługiwane, musisz wrócić do renderowania poza ekranem na poziomie systemu operacyjnego, jak pbuffery.
Jason Allen
źródło