可能不支持 OpenGL 的“弃用”功能吗?

Posted

技术标签:

【中文标题】可能不支持 OpenGL 的“弃用”功能吗?【英文标题】:Can the OpenGL 'deprecated' functions possibly be unsupported? 【发布时间】:2015-06-21 07:48:29 【问题描述】:

我正在使用 glDrawPixels 进行测试,以便将我的简单像素绘制 2D 游戏从 Windows API 移植到带有 GLFW 的 OpenGL。它在 FPS 超过 100 的情况下运行良好,而且还跨平台。

让我有点恼火的一件事是我正在使用一个已弃用的功能。我现在没有看到任何问题,但是将来这可能是一个问题吗? glDrawPixels 会被突然删除吗?我所需要的只是winapi的CreateWindowBitBlt的跨平台替代品。

【问题讨论】:

opengl.org/wiki/Deprecation 那么,您是在 Windows 上将存储在进程内存中的 RGB 像素阵列绘制到屏幕上吗?你试过 SetDIBitsToDevice 吗? 【参考方案1】:

我想扩展 cmets 中已经给出的 article about deprecation in the OpenGL wiki。

目前的情况是,我们可以在桌面平台上辨别出 OpenGL 上下文的 3 种“风味”:

    “旧版”总帐。这意味着旧时代的 GL,在任何弃用方案之前,在专门版本化的上下文或配置文件之前。 核心配置文件中的“现代”GL。 兼容性配置文件中的“现代”GL。

第一种情况,“旧版”GL,以跨平台方式仅限于 GL 2.1 及更早版本。所有主要的桌面操作系统(Windows、Linux、OSX)在所有主要的 GPU 品牌(英特尔、NVidia、AMD)上都支持此功能。而且这不太可能在很长一段时间内消失,因为所有甚至不知道现代 GL 存在的“旧”软件都依赖于它。

我所说的“现代”GL 是指 GL 3.2 及更高版本。在那里,profiles 被发明出来了。关键是只需要支持 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)将图像传送到屏幕上可能会好得多。

【讨论】:

以上是关于可能不支持 OpenGL 的“弃用”功能吗?的主要内容,如果未能解决你的问题,请参考以下文章

当 OSX 不再支持 OpenGL 时,SDL 是不是仍会正式支持 OSX?

已弃用的 OpenGL 功能

为啥OpenGL不支持多索引缓冲?

用模拟器引导游戏时出现 显卡可能不支持最新的opengl渲染 请问是啥原因

Unity3D 导出apk,OpenGL es2手机不支持问题的解决

OpenGL:渲染到 FBO 时是不是支持纹理组合器功能?