OpenGL实践 - 运行没有核心版本的OpenGL

时间:2014-07-26 22:44:49

标签: opengl glew

我不确定这是一个问题或意见需要由用户在这里塑造, 但是我们走了。

问题:即使我想支持最新版本和扩展,我是否应该在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>

对于文字墙感到抱歉,我们将非常感谢有关主题的一些意见。

1 个答案:

答案 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_VERSIONGL_MINOR_VERSION整数查询,这使得解析该字符串过时。

  

问题#2 - 扩展(MISSING,OK?)

glewinfos的输出可能令人困惑。但重要的是它为每个扩展编写的第一件事。这就是GL实现通过扩展字符串实际宣传为支持的扩展。它清楚地说“MISSING”,因此尝试使用该功能是未定义的行为,无论函数指针是否为NULL。

我不知道为什么你有一个空指针而GLEW没有。实际上,mesa是一个用于众多不同驱动器的框架,使用相同的前端libGL.so。因此,这是一个很好的示例,其中函数可能存在但不能使用,因为并非所有的mesa后端驱动程序都支持它。

GLEW在这方面被打破了,因为它只使用GL_EXTENSIONS字符串,现在不再在现代核心文件中使用了。{1}}字符串。 glewExperimental hack禁用字符串全部检查,并尝试使用它获得的指针。这不是一件好事......

  

问题#3 - 命名惯例

扩展程序的原型循环将是

  • 供应商特定(NV / AMD / APPLE / INTEL /...)
  • 多供应商(EXT)
  • ARB-appoved(ARB)
  • 整合到核心。

然而,这或多或少只是通常的情况。一些扩展直接从EXT升级到核心。进入核心时,一些ARB扩展会被大量修改。有时,更高版本的核心功能也会作为扩展引入(特别是对于较低版本)。

实际上,特定于供应商的扩展和EXT扩展都使用函数名称和枚举的后缀。 ARB扩展可能仅在首次在该扩展中定义时使用它。 GL_ARB_sync扩展程序的问题部分为此提供了一个很好的解释:

  

13)为什么入口点/枚举没有附加ARB?   此功能将直接进入OpenGL 3.2核心   并且还被定义为旧平台的扩展   同时,所以它不像其他一样使用ARB后缀   这些新功能直接进入GL核心。

我对ARB_texture stoarge并不是100%肯定,但我认为它与GL 4.2一起被引入,这是一个核心功能。这些扩展允许实现者支持扩展,即使它们不支持最初引入该功能的GL核心版本。

  

我的问题是,我如何知道API是否仍在等待董事会批准,或者它是否已经是核心的一部分,从标题和函数名称来判断。

我的问题是:你为什么要那样做?这对什么有用?一般规则是“如果它没有后缀,它是某些 GL版本的核心功能。”但是你会对这些信息做些什么呢?