【发布时间】:2023-04-02 09:59:01
【问题描述】:
我不确定这是需要由这里的用户塑造的问题或意见, 但是我们开始了。
问题:即使我想支持最新版本和扩展,我是否应该在 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:Code snippet 上面的例子确实返回了“openGL”版本 7.0,这实际上是 MESA3D 驱动程序版本,这让我认为它不可靠。
问题 #2 - 扩展程序(丢失,好吗?) 使用与以前相同的 MESA3D 驱动程序:7.11,运行 Glewinfo (glew 1.9.0) 给了我以下内容:
GL_ARB_texture_storage: 丢失确定
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_ARB_debug_output”中有函数“glDebugMessageCallbackARB” 和 GL 版本 4.3 中的 glDebugMessageCallback,看起来还不错, 但是看看上面第2期的例子,你可能会在“GL_ARB_texture_storage”里面看到函数:glTexStorage1D, No ARB suffix。
我的问题是,根据标题和函数名称,我如何知道 API 是否仍在等待董事会批准,或者它是否已经是核心的一部分。
对不起,文字墙,一些关于主题的输入将不胜感激。
【问题讨论】: