我有一个难以调试的问题,如果我加载GL上下文为3.1或更低,而不是3.2或更高(我试图达到4.4),OpenGL投掷,OpenGL渲染(Windows操作系统) glDrawArraysEXT上的一个模糊的INVALID_OPERATION错误。
我认为问题可能是一个或多个函数被称为“旧”版本,使用GL 1.0 / 1.1函数而不是可能需要的等效3.0+扩展方法。例如,我用glDrawArraysEXT替换了glDrawArrays修复了一个早期的bug,但也许有更多这样的函数需要更新的版本?
所以我的问题是,我怎么知道我是否打算对我的其他任何功能使用“替换”扩展方法?例如我的假设是glViewport没有扩展方法(因为我试图加载它并且找不到它),所以使用核心版本很好。但是如何在不使用扩展方法的情况下检查我正在调用的所有函数?
如果有帮助,这里是我正在调用的OpenGL 1.0 / 1.1函数列表:
其中任何一种都有我应该使用的扩展方法,我应该如何自己找到它?
答案 0 :(得分:3)
例如,我用glDrawArraysEXT替换了glDrawArrays修复了一个早期的bug,但也许有更多这样的函数需要更新的版本?
这不是扩展的工作方式。 glDrawArraysEXT
不是核心OpenGL函数;它是一个扩展功能。除非实现指定它实现此扩展,否则您无法调用。
GL 1.0没有数组渲染; glBegin / End就是你所拥有的一切。有一个扩展EXT_vertex_arrays,它添加了glDrawArraysEXT
和glDrawElementsEXT
(以及其他内容)。那些最终被吸收到GL 1.1中,因此失去了EXT后缀。
换句话说,glDrawArraysEXT
被 glDrawArrays
取代,而不是相反。因此,如果使用EXT版本"修复了早期的错误",它没有;只有出现才能这样做。因此,您不应该寻找扩展功能来替换您的核心功能。
对于您的具体问题,有许多OpenGL loaders只会生成特定API版本中使用的OpenGL函数。 " glLoadGen" (我的)可以做到,但是很高兴"也可以做到。
答案 1 :(得分:2)
我在GitHub上有一个概念验证项目,可以帮助你。
Khronos在OpenGL注册表中提供了一个XML文件,该文件描述了API的每个版本以及每个标准常量。他们使用它来构建API文档等。如果你解析它,XML文件是可搜索的,但我知道很少有工具可以做到这一点。
用C ++编写的这个simple program大约一个小时就会告诉你关于扩展,常量或函数的所有信息。这包括它的核心版本,是否可选,是否有任何别名(提供相同功能的扩展)以及它被弃用和/或删除的版本。
答案 2 :(得分:1)
在回复您的后续评论(重新:ABI)时,我相信我看到了您的目标并且不是我最初的回答。
虽然不相关,但我认为最初讨论的代码库与讨论有一定关系,并选择将其分开。这个答案反而讨论了ABI,因为它与你可能遇到的三个主要平台(Windows,GNU / Linux和Mac OS X)有关,特别强调Windows,因为它是唯一能够以现实的方式表现出来的平台。提示。
从Windows 95 OSR2开始,OpenGL32.dll
提供了与OpenGL 1.1兼容的ABI,功能完整,最高可达1.1。这种状态从未改变 - OpenGL 1.1中未定义的任何内容都需要可安装的客户端驱动程序(ICD) - 而20年来唯一的变化就是引入了64位版本的OpenGL32.dll
。
作为一个平台,GNU / Linux无法保证任何OpenGL支持(因此没有标准的ABI),并且Apple是每个操作系统版本中不断变化的ABI的真正奇怪的球。
Apple的ABI很棘手,因为有很多功能可以链接到并调用,但是当从不受支持的上下文 调用时,除了引发GL_INVALID_OPERATION
之外什么都不会做什么(听起来很熟悉?! ) 即可。 Apple提出此错误的决定至少是一致的,但从未与您将遇到的任何其他平台进行充分讨论或共享。扩展在OS X上毫无意义,但Apple确实在AGL中定义了一种机制来查询它们各自的函数指针(可能与其他所有平台进行奇偶校验?)。
在Windows上,ABI从未增长或缩减。 20年前它支持glDrawArraysEXT
,直到今天,参考GDI实现仍然如此。您通常不会在GDI实现上运行任何软件;它像泥土一样缓慢,与平台的现代硬件加速层几乎没有交互。
尽管该平台最初设计时考虑了混合GDI /硬件驱动程序(迷你客户端驱动程序),但这种情况从未实现过。与MCD相比,可安装客户端驱动程序(ICD)实现了OpenGL32.dll
至少所做的一切,MCD只实现了OpenGL32.dll
的一个子集,可能会回退到平台的GDI憎恶的任何其他内容。
由于迷你客户端驱动程序从不实用,只是作为快速权宜之计(想想DOS时代的Quake微型驱动程序),因此在Windows上遇到的任何和所有OpenGL驱动程序都将是完整的ICD或完全基于软件的。您始终可以使用glDrawArraysEXT
,它始终由与OpenGL的其他部分相同的驱动程序提供。
这一切都很好, 但是 意味着很少,因为最初讨论的glDrawArraysEXT
函数与glDrawArrays
不同。一个跟随另一个,但将它解雇“更新版本”是错误的,就像你可能不希望被标记为你父母的新版本一样......
除了少数几种情况之外,当调用XYZ
添加到其末尾的内容时,您可以假设正在讨论与后缀免费版本相关但不相同的内容。
如果从glDrawArrays
切换到glDrawArraysEXT
并且您正在处理Windows(并且合理地假设MCD不存在)时行为发生了变化,那是因为该函数应该具有不同的行为(或你有一个错误的驱动程序) - 不是因为它是由其他东西提供的。
Windows是唯一一个设计有驱动程序模型的平台,它可能会在多个驱动程序之间任意分割其GL实现,因为除了历史书之外,这个因素应该适用于所有基础。