Compatibilidade com OpenGL, convenções de nomenclatura e ARB vs EXT

14

Eu pensei que tinha formado um entendimento geral de como as convenções e extensões de nomes do OpenGL funcionavam, até me deparar com um caso que me confundia.


Aqui está o meu entendimento até agora:

Sem sufixo - por exemplo glGenBuffers(). Esta função faz parte do perfil principal. A página wiki me diz que isso foi adicionado ao perfil principal a partir da versão 1.5.

ARB - por exemplo glGenBuffersARB(). Esta função faz parte da GL_ARB_vertex_buffer_objectextensão padronizada . As especificações desta extensão declaram claramente GenBuffersARB()na seção "Novos procedimentos e funções". A seção "Dependências" diz que eu posso acessar isso potencialmente a partir de um contexto 1.4+, se o hardware suportar a extensão.

EXT - Essas são extensões e funções específicas do fornecedor que apenas alguns fornecedores podem suportar. O objeto de buffer do vértice não parece ter uma extensão EXT no registro.


Aqui é onde meu entendimento se divide:

glGenFramebuffers, como mostra o wiki , foi adicionado ao núcleo no 3.0.

Agora, quero acessar os recursos do buffer de quadros em uma versão de perfil principal inferior a 3.0. Então, eu quero usá-lo como uma extensão. O registro de especificações informa que existem duas extensões disponíveis - ARB e EXT .

Pergunta 1 - Se existe uma extensão ARB, por que existe uma extensão EXT? Você não escolheria sempre o padronizado sobre o específico do fornecedor?

Uma olhada na especificação do ARB na seção "Novos procedimentos e funções" informa que a extensão define a GenRenderbuffers()função. Nenhum sufixo ARB neste momento. O GLEW não possui um protótipo de função glGenRenderbuffersARB(). Esquisito.

A especificação EXT, no entanto, possui uma GenRenderbuffersEXT()função na seção de novas funções, e o GLEW também possui glGenRenderbuffersEXT().

Pergunta 2 - Por que nenhum sufixo ARB se existe um sufixo EXT? Como isso funciona para o ARB, considerando que os nomes da função ARB e da função principal são os mesmos?

Pergunta 3 - Em última análise, quero os recursos do Framebuffer a partir de um perfil 1.4. Qual extensão e qual conjunto de funções devo usar para obter a cobertura máxima de compatibilidade de hardware?

ApoorvaJ
fonte

Respostas:

9

Pergunta 1 - Geralmente, a versão EXT vem em primeiro lugar como uma colaboração entre dois ou mais fornecedores. As extensões ARB exigem mais discussão entre os membros votantes do Khronos e podem ter alterações na versão EXT antes de serem aprovadas. Consulte a extensão GL_ARB_direct_state_access que possui muitas alterações em comparação com GL_EXT_direct_state_access.

Pergunta 2 - A seção Issues da extensão GL_ARB_framebuffer_object indica por que as funções não possuem sufixos ARB:

(8) Por que os novos tokens e pontos de entrada nessa extensão não possuem sufixos como outras extensões 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.

Pergunta 3 - Se você deseja usar objetos framebuffer em um contexto em que a versão GL é menor que 3.0, é necessário examinar a cadeia de extensão:

  1. Se GL_ARB_framebuffer_object for suportado, use as funções não ARB.
  2. Se apenas GL_EXT_framebuffer_object for suportado, use as funções EXT.
  3. Se nenhuma extensão for suportada, você precisará retornar à renderização fora da tela no nível do SO, como pbuffers.
Jason Allen
fonte