我不确定这是一个问题或意见需要由用户塑造,但我们走了.
问题:即使我想支持最新版本和扩展,我是否应该在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以及其他项目解析器,他们只查找字符串中的第一个点,并返回点所在的数字,作为字符串(您可以选择转换为浮点)
来自Glew 1.9.0:代码片段 上面的例子确实返回了"openGL"版本7.0,它实际上是MESA3D驱动程序版本,这使我认为它不可靠.
问题#2 - 使用与以前相同的MESA3D驱动程序扩展(MISSING,OK?):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 - 命名约定,Core,ARB和glew.**我还不确定名称约定是如何工作的,例如:似乎你在GL版本4.3中的"GL_ARB_debug_output"中有函数"glDebugMessageCallbackARB"和glDebugMessageCallback,看起来没问题,但是看看上面第2期的例子,你可能会在"GL_ARB_texture_storage"里面看到函数:glTexStorage1D,没有ARB后缀.
我的问题是,我怎么知道API是否还在等待董事会批准,或者它是否已经是核心的一部分,从标题和函数名称来判断.
对于文本墙感到抱歉,对主题的一些输入将不胜感激.
问题:即使我想支持最新版本和扩展,我是否应该在1.1版兼容性配置文件中运行openGL?
首先:没有1.1"兼容性配置文件".GL 3.2中引入了配置文件.但是把它放在一边,你的问题的答案显然是否定的.如果你关心便携性,至少.要声明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版本开头.现代GL还提供了GL_MAJOR_VERSION与GL_MINOR_VERSION整数查询,这使得解析该字符串过时.
问题#2 - 扩展(MISSING,OK?)
glewinfos的输出可能令人困惑.但重要的是它为每个扩展编写的第一件事.这就是GL实现通过扩展字符串实际宣传为支持的扩展.它清楚地说"MISSING",因此尝试使用该功能是未定义的行为,无论函数指针是否为NULL.
我不知道为什么你有一个空指针,而GLEW没有.实际上,mesa是一个用于众多不同驱动器的框架,使用相同的前端libGL.so.因此,这是一个很好的示例,其中函数可能存在但不能使用,因为并非所有的mesa后端驱动程序都支持它.
GLEW在这方面已经被打破了,因为它只使用了GL_EXTENSIONS字符串,现在不再用于现代核心孔.该glewExperimental黑客禁用字符串检查产品总数,并尝试使用它得到的指针.这不是一件好事......
问题#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版本的核心功能." 但是你会对这些信息做些什么呢?