使用驱动程序不支持的更高版本 OpenGL 的常量是不是安全?

Posted

技术标签:

【中文标题】使用驱动程序不支持的更高版本 OpenGL 的常量是不是安全?【英文标题】:Is it safe to use constants of higher version of OpenGL which is not supported by driver?使用驱动程序不支持的更高版本 OpenGL 的常量是否安全? 【发布时间】:2013-09-12 02:27:00 【问题描述】:

例如,我使用 GL_LUMINANCE_ALPHA 将两个组件数据传输到纹理。 有人告诉我,一些内部格式常量,如 GL_LUMINACE_ALPHA 在 OpenGL 3.0(可能是 4.0?)或更高版本中已弃用,因此请使用 GL_RG 或 GL_RG8 等。

但是,我的目标 OpenGL 版本是 2.0 或更高版本,并且 OpenGL 2.0 的规范不包含 GL_RG/GL_RG8。 在这种情况下,我认为有三种可能:

    如果程序即使在仅支持 OpenGL 2.0 的设备上也能正常运行,请使用 GL_RG/GL_RG8。 如果程序可以在 OpenGL 版本高到不推荐使用旧常量的设备上正常运行,请保留旧常量。 在运行时检测 OpenGL 版本并为每个版本切换常量。

我应该选择什么? 我不想拿 3。除非我必须这样做,因为这会让事情变得更加困难和复杂。

【问题讨论】:

【参考方案1】:

不,使用驱动程序一无所知的 OpenGL 令牌是不安全的。幸运的是,绝大多数 API 调用只会引发 GL_INVALID_ENUM 错误,并且操作会在有机会真正搞砸之前提前失败。

解决您的GL_LUMINANCE_ALPHA 困境不仅仅是简单地交换令牌GL_RG8。您将不得不在着色器中使用纹理混合或混合来使纹理的颜色为 (R, R, R, G)

尽早确定您所针对的 OpenGL 版本,或编写单独的代码路径。但这绝不会像在运行时切换枚举值那么简单。

【讨论】:

谢谢。我决定在运行时切换枚举和着色器。

以上是关于使用驱动程序不支持的更高版本 OpenGL 的常量是不是安全?的主要内容,如果未能解决你的问题,请参考以下文章

iOS 中不推荐使用的常量

Modern OpenGL 3.x 及更高版本如何绘制图元?

在 90 或更高版本的兼容模式下,ORDER BY 子句中不允许使用常量表达式

如何在 OpenGL 3.0 中编程? (没有更高)

如何在 GTX 560 及更高版本上使用 OpenGL 进行立体 3D?

使用带有 ViewPager 错误的 GridView 创建的应用程序:-source 1.7 中不支持 lambda 表达式(使用 -source 8 或更高版本 [重复]