Compatibilidad con OpenGL, convenciones de nomenclatura y ARB vs EXT

14

Pensé que había formado una comprensión general de cómo funcionaban las convenciones y extensiones de nomenclatura de OpenGL, hasta que me topé con un caso que me confundió.


Aquí está mi entendimiento hasta ahora:

Sin sufijo , por ejemplo glGenBuffers(). Esta función es parte del perfil central. La página wiki me dice que esto se agregó al perfil principal a partir de la versión 1.5.

ARB - por ejemplo glGenBuffersARB(). Esta función es parte de la GL_ARB_vertex_buffer_objectextensión estandarizada . La especificación de esta extensión declara claramente GenBuffersARB()en la sección "Nuevos procedimientos y funciones". La sección "Dependencias" me dice que potencialmente puedo acceder a esto desde un contexto 1.4+, si el hardware admite la extensión.

EXT : estas son extensiones y funciones específicas del proveedor que solo algunos proveedores pueden admitir. El objeto de búfer Vertex no parece tener una extensión EXT en el registro.


Aquí es donde se rompe mi comprensión:

glGenFramebuffers, como muestra la wiki , se agregó al núcleo en 3.0.

Ahora quiero acceder a las funciones de frame buffer en una versión de perfil de núcleo inferior a 3.0. Entonces quiero usarlo como una extensión. El registro de especificaciones me dice que hay dos extensiones disponibles: ARB y EXT .

Pregunta 1 - Si existe una extensión ARB, ¿por qué existe una extensión EXT? ¿No elegirías siempre la estandarizada sobre la específica del proveedor?

Una mirada a la especificación ARB en la sección "Nuevos procedimientos y funciones" me dice que la extensión define la GenRenderbuffers()función. No hay sufijo ARB esta vez. GLEW no tiene un prototipo de función para glGenRenderbuffersARB()nada. Extraño.

Sin embargo, la especificación EXT tiene una GenRenderbuffersEXT()función en la sección de nuevas funciones, y GLEW también glGenRenderbuffersEXT().

Pregunta 2 : ¿Por qué no hay sufijo ARB si hay un sufijo EXT? ¿Cómo funciona esto para ARB, dado que los nombres de la función ARB y la función central son los mismos?

Pregunta 3 : en última instancia, quiero las funciones de Framebuffer de un perfil 1.4. ¿Qué extensión y qué conjunto de funciones debo usar para obtener la máxima cobertura de compatibilidad de hardware?

ApoorvaJ
fuente

Respuestas:

9

Pregunta 1 : por lo general, la versión EXT viene primero como una colaboración entre dos o más proveedores. Las extensiones ARB requieren más discusión entre los miembros votantes de Khronos y pueden tener cambios de la versión EXT antes de ser aprobadas. Vea la extensión GL_ARB_direct_state_access que tiene muchos cambios en comparación con GL_EXT_direct_state_access.

Pregunta 2 : la sección Problemas de la extensión GL_ARB_framebuffer_object establece por qué las funciones no tienen sufijos ARB:

(8) ¿Por qué los nuevos tokens y puntos de entrada en esta extensión no tienen sufijos como otras extensiones 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.

Pregunta 3 - Si desea usar objetos framebuffer en un contexto donde la versión GL es menor que 3.0, debe mirar la cadena de extensión:

  1. Si GL_ARB_framebuffer_object es compatible, use las funciones no ARB.
  2. Si solo se admite GL_EXT_framebuffer_object, use las funciones EXT.
  3. Si ninguna de las extensiones es compatible, debe volver al nivel de SO fuera de la pantalla como pbuffers.
Jason Allen
fuente