关于使用OpenGL扩展的这个问题,这些扩展功能的目的是什么?我为什么要使用它们?此外,是否有任何与使用它们相关的权衡或陷阱?
OpenGL标准允许各个供应商在创建新技术时通过扩展提供附加功能.扩展可能会引入新函数和新常量,并可能放松或删除对现有OpenGL函数的限制.
每个供应商都有一个字母缩写,用于命名它们的新函数和常量.例如,NVIDIA的缩写(NV)用于定义其专有函数glCombinerParameterfvNV()及其常量GL_NORMAL_MAP_NV.
可能会发生多个供应商同意实施相同的扩展功能.在那种情况下,使用缩写EXT.架构评审委员会可能进一步"祝福"扩展.然后它被称为标准扩展,并使用缩写ARB.第一个ARB扩展是GL_ARB_multitexture,在1.2.1版本中引入.在官方扩展推广路径之后,多重纹理不再是可选的ARB扩展,而是自1.3版以来一直是OpenGL核心API的一部分.
在使用扩展之前,程序必须首先确定其可用性,然后获取指向扩展定义的任何新函数的指针.执行此操作的机制是特定于平台的,并且存在诸如GLEW和GLEE的库以简化该过程.
OpenGL扩展是OpenGL规范中添加的新功能,它们由OpenGL标准组织和各种图形卡供应商添加.它们作为新的函数调用或变量暴露给程序员.每个新版本的OpenGL规范都附带更新的功能,并且(通常)包含所有以前的功能和扩展.
OpenGL扩展的真正问题仅存在于Windows上.Microsoft不支持在OpenGL v1.1之后发布的任何扩展.显卡供应商通过头文件和库发布他们自己的这个功能版本来克服这个问题.但是,使用这个可能会有点痛苦,因为您链接的问题显示.但是随着GLEW的普及,这个问题已经基本消失了,GLEW负责将所有这些包装成易于使用的包装.
如果您确实使用了最新的OpenGL扩展,请注意旧版图形硬件可能不支持它.除此之外,使用这些扩展没有其他缺点.大多数成为标准的扩展都非常有用,并且没有使用它们的逻辑非常少.
通常,扩展是图形卡供应商向OpenGL添加新功能的一种方式,而不必等到OpenGL规范的下一版本.有不同类型的扩展:
供应商扩展 - 只有一个供应商提供某种类型的功能.
例: NV_vertex_program
多厂商扩展 - 多家供应商聚在一起并就功能达成一致.
例: EXT_vertex_program
ARB扩展 - OpenGL架构审查委员会祝福了扩展.您有合理的期望这种类型的扩展将会存在一段时间.
例: ARB_vertex_program
扩展不必经历所有这些步骤.有时,只有硬件设计采用不同的方式并且放弃了扩展,一个供应商才会实施扩展.其他时候,在每个人都认为有更好的方式之前,延期可能会使其达到ARB状态.(ARB_vertex_program
例如,这种方法被搁置以支持高级着色语言方法,ARB_vertex_shader
当时将着色器滚动到核心OpenGL规范中.)即使ARB扩展也不会永远存在; 例如,我今天不会写一些要求的东西ARB_matrix_palette
.
所有这些都说过了,最好跟上扩展,特别是最新的ARB和EXT扩展.在过去,通过硬件的某些"快速路径"只能通过扩展访问.同样,如果您想知道硬件可以执行的所有功能,那么没有比特定于供应商的扩展更好的地方了.
如果您刚刚开始使用OpenGL,我建议您调查:
ARB_vertex_buffer_object
(顶点)
ARB_vertex_shader
/ ARB_fragment_shader
/ ARB_shader_objects
/ GLSL规范(着色器)
更先进:
ARB/EXT_framebuffer_object
(离屏渲染)
这是所有已经融入核心的功能,但单独查看它可能会很好,这样您就可以更好地了解其边界所在.(核心OpenGL规范将旧版本与新版本无缝混合,因此如果您希望保持快速路径并避免遗留问题并且有时在软件路径中实现,这可能非常重要.)
无论您做什么,请确保对您决定使用的扩展程序进行适当的检查,并在必要时进行回退.即使您的卡可能具有给定的分机,也不能保证该分机将出现在另一个供应商的卡上,或者甚至在具有相同卡的另一个操作系统上.