关于Using OpenGL extensions的这个问题,这些扩展功能的目的是什么?我为什么要使用它们?此外,是否有与使用它们相关的权衡或陷阱?
答案 0 :(得分:20)
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之类的库以简化该过程。
答案 1 :(得分:6)
OpenGL Extensions 是添加到 OpenGL规范的新功能,它们由OpenGL标准组织和各种图形卡供应商添加。它们作为新的函数调用或变量暴露给程序员。每个新版本的OpenGL规范都附带更新的功能,并且(通常)包含所有以前的功能和扩展。
OpenGL扩展的真正问题仅存在于Windows上。 Microsoft不支持在 OpenGL v1.1 之后发布的任何扩展。显卡供应商通过头文件和库发布他们自己的这个功能版本来克服这个问题。但是,使用这个可能会有点痛苦,因为您链接的问题显示。但是这个问题已经随着 GLEW 的普及而消失了,它将所有这些都包装成一个易于使用的包。
如果您确实使用了最近的OpenGL扩展,请注意旧版图形硬件可能不支持它。除此之外,使用这些扩展没有其他缺点。大多数成为标准的扩展都非常简单有用,并且没有使用它们的逻辑很少。
答案 2 :(得分:5)
扩展通常是图形卡供应商向OpenGL添加新功能的一种方式,而无需等到OpenGL规范的下一版本。有不同类型的扩展:
NV_vertex_program
EXT_vertex_program
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规范将旧版本与新版本无缝混合,因此如果您希望保持快速路径并避免遗留问题并且有时在软件路径中实现,这可能非常重要。)
无论您做什么,请确保对您决定使用的扩展程序进行适当的检查,并在必要时进行回退。即使您的卡可能有一个给定的分机,也不能保证该分机将出现在另一个供应商的卡上,或者甚至在另一个具有相同卡的操作系统上。