使用驱动程序不支持的更高版本 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 的常量是不是安全?的主要内容,如果未能解决你的问题,请参考以下文章
Modern OpenGL 3.x 及更高版本如何绘制图元?
在 90 或更高版本的兼容模式下,ORDER BY 子句中不允许使用常量表达式
如何在 GTX 560 及更高版本上使用 OpenGL 进行立体 3D?
使用带有 ViewPager 错误的 GridView 创建的应用程序:-source 1.7 中不支持 lambda 表达式(使用 -source 8 或更高版本 [重复]