OpenGL 'deprecated' 功能可能不受支持吗?
Can the OpenGL 'deprecated' functions possibly be unsupported?
我正在使用 glDrawPixels
进行测试,以便将我的简单像素绘制 2D 游戏从 Windows API 移植到带有 GLFW 的 OpenGL。它运行良好,FPS 超过 100,此外还跨平台。
只有一件事让我有点恼火,那就是我使用了一项已弃用的功能。我现在没有看到任何问题,但这可能会成为未来的问题吗? glDrawPixels
会突然被删除吗?我所需要的只是 winapi 的 CreateWindow
和 BitBlt
.
的跨平台替代方案
我想扩展已经在评论中给出的 article about deprecation in the OpenGL wiki。
目前的情况是,我们可以在桌面平台上识别出 3 "flavours" 个 OpenGL 上下文:
- "Legacy" GL。这意味着过去的 GL,在没有任何弃用方案之前,在有特定版本的上下文或配置文件之前。
- "Modern" 核心配置文件中的 GL。
- "Modern" 兼容性配置文件中的 GL。
第一种情况,"legacy"GL,以跨平台方式仅限于GL 2.1及更早版本。所有主要桌面 OS(Windows、Linux、OSX)在所有主要 GPU 品牌(Intel、NVidia、AMD)上都支持此功能。这不太可能消失很长时间,因为所有甚至不知道现代 GL 存在的 "old" 软件都依赖它。
我所说的 "modern" GL 表示 GL 3.2 及更高版本。在那里,配置文件 被发明了。关键是只需要支持 core 配置文件, compatibility 配置文件是可选的。在核心配置文件中,已弃用的函数实际上已 删除,因此您的代码将无法在核心配置文件中运行。在兼容性配置文件中,已弃用的功能仍然可用。
因此,将旧的遗留功能(如固定功能管道、即时模式或您的 glDrawPixels
调用)与现代 GL 功能混合的唯一方法是兼容性配置文件。然而,在实践中,兼容性支持并不普遍可用。 MacOSX一般不支持兼容性配置文件,基于Mesa的开源Linux驱动也不支持。因此,您不能真正使用兼容性配置文件进行跨平台开发。
请注意,我以某种方式跳过了 GL 3.0 和 3.1。它们介于两者之间,我建议永远不要尝试使用它们。 OSX 根本不支持它们。实际上,任何支持 GL 3.0 的真实世界 GPU 也至少支持 GL 3.2。
我看到两个选项供您选择:
- 如果 GL 2.1 中的功能集足以满足您的用例,您可以简单地坚持使用旧版 GL。对它的支持不会消失很长时间。
- 在不使用已弃用函数的情况下切换到现代 GL。
glDrawPixels
从来没有效率。使用带纹理的四边形(甚至 glBlitFramebuffer
)将图像传送到屏幕可能会好得多。
我正在使用 glDrawPixels
进行测试,以便将我的简单像素绘制 2D 游戏从 Windows API 移植到带有 GLFW 的 OpenGL。它运行良好,FPS 超过 100,此外还跨平台。
只有一件事让我有点恼火,那就是我使用了一项已弃用的功能。我现在没有看到任何问题,但这可能会成为未来的问题吗? glDrawPixels
会突然被删除吗?我所需要的只是 winapi 的 CreateWindow
和 BitBlt
.
我想扩展已经在评论中给出的 article about deprecation in the OpenGL wiki。
目前的情况是,我们可以在桌面平台上识别出 3 "flavours" 个 OpenGL 上下文:
- "Legacy" GL。这意味着过去的 GL,在没有任何弃用方案之前,在有特定版本的上下文或配置文件之前。
- "Modern" 核心配置文件中的 GL。
- "Modern" 兼容性配置文件中的 GL。
第一种情况,"legacy"GL,以跨平台方式仅限于GL 2.1及更早版本。所有主要桌面 OS(Windows、Linux、OSX)在所有主要 GPU 品牌(Intel、NVidia、AMD)上都支持此功能。这不太可能消失很长时间,因为所有甚至不知道现代 GL 存在的 "old" 软件都依赖它。
我所说的 "modern" GL 表示 GL 3.2 及更高版本。在那里,配置文件 被发明了。关键是只需要支持 core 配置文件, compatibility 配置文件是可选的。在核心配置文件中,已弃用的函数实际上已 删除,因此您的代码将无法在核心配置文件中运行。在兼容性配置文件中,已弃用的功能仍然可用。
因此,将旧的遗留功能(如固定功能管道、即时模式或您的 glDrawPixels
调用)与现代 GL 功能混合的唯一方法是兼容性配置文件。然而,在实践中,兼容性支持并不普遍可用。 MacOSX一般不支持兼容性配置文件,基于Mesa的开源Linux驱动也不支持。因此,您不能真正使用兼容性配置文件进行跨平台开发。
请注意,我以某种方式跳过了 GL 3.0 和 3.1。它们介于两者之间,我建议永远不要尝试使用它们。 OSX 根本不支持它们。实际上,任何支持 GL 3.0 的真实世界 GPU 也至少支持 GL 3.2。
我看到两个选项供您选择:
- 如果 GL 2.1 中的功能集足以满足您的用例,您可以简单地坚持使用旧版 GL。对它的支持不会消失很长时间。
- 在不使用已弃用函数的情况下切换到现代 GL。
glDrawPixels
从来没有效率。使用带纹理的四边形(甚至glBlitFramebuffer
)将图像传送到屏幕可能会好得多。