我不确定这是一个问题或意见需要由用户在这里塑造, 但是我们走了。
问题:即使我想支持最新版本和扩展,我是否应该在1.1版兼容性配置文件中运行openGL?更多信息。
某些功能要求您提供您可能想要支持的openGL版本, 如果您想支持openGL核心配置文件或3.0及更高版本,则最常见的用法。 示例:
SDL:
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR/MINOR_VERSION, major/minor version);
GLX:
glXCreateContextAttribsARB, GLX_CONTEXT_MAJOR_VERSION_ARB, GLX_CONTEXT_MINOR_VERSION_ARB
我有一些问题(实际上有一些)与openGL版本控制和扩展系列。
问题#1 - 查询OpenGL版本: 如果我没记错的话,它从Mesa3D Mesa 7.11开始,尝试从中查询GL_VERSION, 我得到了:
“Mesa 7.11 OpenGL 2.1配置文件”
知道glew以及其他项目解析器,他们只是寻找字符串中的第一个点,并返回点所在的数字,作为字符串(您可以选择转换为浮点)< / p>
来自Glew 1.9.0:Code snippet 上面的例子确实返回了“openGL”版本7.0,这实际上是MESA3D驱动程序版本,这使我认为它不可靠。
问题#2 - 扩展程序(MISSING,OK?) 使用与以前相同的MESA3D驱动程序:7.11,运行Glewinfo(glew 1.9.0)给了我以下内容:
GL_ARB_texture_storage:MISSING OK
glTexStorage1D:好的
glTexStorage2D:好的
glTexStorage3D:好的
glTextureStorage1DEXT:好的
glTextureStorage2DEXT:好的
glTextureStorage3DEXT:好的
请注意,尝试从“GL_ARB_texture_storage”API检索(导入)函数地址会导致失败(NULL指针)。
我解决上述两个问题的方法是在兼容模式下将openGL初始化为1.1版,然后通过检查我可能需要的每个API系列来强制我的方式, 如果openGL作为一组独立的API以独立的方式工作,但是我们不应该以代码的方式处理它们,而不是假设它们存在于核心版本中吗?再次使用MESA3D 7.11 openGL 2.1,我仍然可以使用openGL 3.0等功能,例如“glGenerateMipmap”
**我试图避免版本和扩展字符串的方式是:**
1.)在兼容模式下初始化openGL 1.1。
2.)通过导入核心功能扫描您可能需要的API。
3.)如果您无法获得核心功能,请尝试按其扩展名获取功能(如果存在) (无需与扩展名列表“GL_EXTENSIONS”进行字符串比较)
4.)如果您无法获得这些功能,请尝试通过编写自己的功能来模拟它们。
5.)如果上述方法都不起作用,那就放弃吧。
6.)如果上述方法中的任何内容有效,请运行完整性测试并确保函数正常工作,例如:glGetError和应该有效的调用的断言。
你认为它安全/有效吗?我是否通过调用最小版本并试图强行进入我的方式而错过了什么?有没有办法可以改善它? *旁注 - 我知道openGL核心配置文件删除了过时的功能,但您可以自己选择不使用它们,如果您的驱动程序支持最新版本。 我也知道openGL可能会尝试模拟当前版本之外的函数, 取决于你的驱动程序,你仍然可以使用glGenerateMipmap(openGL 3.0函数)与openGL 2.1
问题#3 - 命名惯例,核心,ARB和glew。** 我不确定名称约定是如何工作的,例如: 看来你在“GL_ARB_debug_output”函数中有“glDebugMessageCallbackARB” GL版本4.3中的glDebugMessageCallback,似乎没问题, 但是看看上面第2期的例子,你可能会在“GL_ARB_texture_storage”里面看到函数:glTexStorage1D,没有ARB后缀。
我的问题是,我如何知道API是否仍在等待董事会批准,或者它是否已经是核心的一部分,请根据标题和函数名称来判断。< / p>
对于文字墙感到抱歉,我们将非常感谢有关主题的一些意见。
答案 0 :(得分:5)
问题:即使我想支持最新版本和扩展,我是否应该在1.1版兼容性配置文件中运行openGL?
首先:没有1.1“兼容性配置文件”。 GL 3.2中引入了配置文件。但是把这个问题放在一边,问题的答案显然是 no 。如果你关心便携性,至少。要声明OpenGL一致性,实现必须支持核心配置文件,而兼容性是可选的。这不是一些理论上的可能性,但实际上是在现实世界中实现的。在OSX上,传统的GL上下文仅限于GL 2.1。如果您需要现代GL3.x / 4.x功能,必须使用核心配置文件。 Linux上的mesa 3D开源实现也是如此:现代GL仅在核心配置文件中受支持。在Windows上,通常支持可比性配置文件,并且专有的AMD和Nvidia Linux驱动程序支持兼容配置文件,因此您可以使用“1.1”
问题#1 - 查询OpenGL版本
如果mesa曾将“Mesa 7.11 OpenGL 2.1 Profile”报告为GL_VERSION
,那么它就会被严重破坏(尽管如此我从未体验过台面做过这样的事情)。 GL规范要求版本字符串以数字GL major.minor版本开头。 Modern GL还提供GL_MAJOR_VERSION
和GL_MINOR_VERSION
整数查询,这使得解析该字符串过时。
问题#2 - 扩展(MISSING,OK?)
glewinfos的输出可能令人困惑。但重要的是它为每个扩展编写的第一件事。这就是GL实现通过扩展字符串实际宣传为支持的扩展。它清楚地说“MISSING”,因此尝试使用该功能是未定义的行为,无论函数指针是否为NULL。
我不知道为什么你有一个空指针而GLEW没有。实际上,mesa是一个用于众多不同驱动器的框架,使用相同的前端libGL.so。因此,这是一个很好的示例,其中函数可能存在但不能使用,因为并非所有的mesa后端驱动程序都支持它。
GLEW在这方面被打破了,因为它只使用GL_EXTENSIONS
字符串,现在不再在现代核心文件中使用了。{1}}字符串。 glewExperimental
hack禁用字符串全部检查,并尝试使用它获得的指针。这不是一件好事......
问题#3 - 命名惯例
扩展程序的原型循环将是
然而,这或多或少只是通常的情况。一些扩展直接从EXT升级到核心。进入核心时,一些ARB扩展会被大量修改。有时,更高版本的核心功能也会作为扩展引入(特别是对于较低版本)。
实际上,特定于供应商的扩展和EXT扩展都使用函数名称和枚举的后缀。 ARB扩展可能仅在首次在该扩展中定义时使用它。 GL_ARB_sync扩展程序的问题部分为此提供了一个很好的解释:
13)为什么入口点/枚举没有附加ARB? 此功能将直接进入OpenGL 3.2核心 并且还被定义为旧平台的扩展 同时,所以它不像其他一样使用ARB后缀 这些新功能直接进入GL核心。
我对ARB_texture stoarge并不是100%肯定,但我认为它与GL 4.2一起被引入,这是一个核心功能。这些扩展允许实现者支持扩展,即使它们不支持最初引入该功能的GL核心版本。
我的问题是,我如何知道API是否仍在等待董事会批准,或者它是否已经是核心的一部分,从标题和函数名称来判断。
我的问题是:你为什么要那样做?这对什么有用?一般规则是“如果它没有后缀,它是某些 GL版本的核心功能。”但是你会对这些信息做些什么呢?