"Emulate" 最低 OpenGL 规格?
"Emulate" minimum OpenGL specs?
我们正在使用 OpenGL 4.3。但是,我们担心我们使用的功能适用于我们的显卡,但不在 OpenGL 4.3 的 "minimal" 要求规格中。
是否可以模拟最小行为?例如,让显卡拒绝任何非标准纹理格式等? (也可以在软件中,速度与测试兼容性无关紧要...)
更新
在最好的情况下,所有方面的最小设置都是完美的,因此可以保证应用程序可以在所有支持 OpenGL 4.3 的显卡上运行。所以这个仿真模式应该:
- 拒绝 4.3
中弃用的所有 features/extensions
- 拒绝所有 features/extensions 比 4.3
新的
- 只支持必需的格式,不支持可选格式(例如纹理和渲染缓冲区)
- 只支持计算所需的最低精度
- 具有可通过 GetInteger 查询的受支持限制的最小值(例如 MAX_TEXTURE_IMAGE_UNITS 为 16)
有一个reference GLSL compiler可以解决这个问题的一半。但是,至于其他……AMD、NV 和 Intel 都有自己的合规问题和政策,关于他们相信遵守规范的松散程度。
我已经看到这些供应商中的每一个都隐式地启用了他们不应该拥有的 OpenGL 版本的扩展(编译器日志中没有警告),而这只是 GLSL 方面的事情。 Mesa 很可能可以充当功能测试的最大公因数,但对于比 4.3 早得多的 OpenGL 版本。 Mesa 实际上是一个极简主义的实现,通常比大型硬件供应商落后几年。
理想情况下,GL 的 debug output extension, which is conveniently a core feature in GL 4.3, would issue API warnings if you use a feature your requested context version does not support. However, each vendor has different levels of support for this; AMD is generally the best. NVIDIA may even require you to enable "OpenGL Expert" mode 在吐出任何真正有用的信息之前。
如果一切都失败了,还有 XML file published by Khronos that you can parse to figure out which version and/or extension ANY OpenGL constant, function or enumerant is provided by. I wrote a simple project to do this with half a day's effort: https://github.com/Andon13/glvs。您可以根据该原则自己编写某种验证器。
有许多 OpenGL Loading Libraries 可以在某种程度上满足您的需求。 GLEW 只是给你一切,让你挑选你想要的。但是还有其他一些生成更具体的加载程序。
GL3w 例如仅生成核心 OpenGL 函数,完全忽略扩展。
为了更全面的解决方案,有glLoadGen or GLad. Both of these are generators for the headers and loading code. But both of them allow you to specify exactly which version of OpenGL you want and exactly which extensions you want. GLad even has a web application可以生成headers并下载到您的计算机。
为了完全公开,我写了 glLoadGen。
我们正在使用 OpenGL 4.3。但是,我们担心我们使用的功能适用于我们的显卡,但不在 OpenGL 4.3 的 "minimal" 要求规格中。
是否可以模拟最小行为?例如,让显卡拒绝任何非标准纹理格式等? (也可以在软件中,速度与测试兼容性无关紧要...)
更新
在最好的情况下,所有方面的最小设置都是完美的,因此可以保证应用程序可以在所有支持 OpenGL 4.3 的显卡上运行。所以这个仿真模式应该:
- 拒绝 4.3 中弃用的所有 features/extensions
- 拒绝所有 features/extensions 比 4.3 新的
- 只支持必需的格式,不支持可选格式(例如纹理和渲染缓冲区)
- 只支持计算所需的最低精度
- 具有可通过 GetInteger 查询的受支持限制的最小值(例如 MAX_TEXTURE_IMAGE_UNITS 为 16)
有一个reference GLSL compiler可以解决这个问题的一半。但是,至于其他……AMD、NV 和 Intel 都有自己的合规问题和政策,关于他们相信遵守规范的松散程度。
我已经看到这些供应商中的每一个都隐式地启用了他们不应该拥有的 OpenGL 版本的扩展(编译器日志中没有警告),而这只是 GLSL 方面的事情。 Mesa 很可能可以充当功能测试的最大公因数,但对于比 4.3 早得多的 OpenGL 版本。 Mesa 实际上是一个极简主义的实现,通常比大型硬件供应商落后几年。
理想情况下,GL 的 debug output extension, which is conveniently a core feature in GL 4.3, would issue API warnings if you use a feature your requested context version does not support. However, each vendor has different levels of support for this; AMD is generally the best. NVIDIA may even require you to enable "OpenGL Expert" mode 在吐出任何真正有用的信息之前。
如果一切都失败了,还有 XML file published by Khronos that you can parse to figure out which version and/or extension ANY OpenGL constant, function or enumerant is provided by. I wrote a simple project to do this with half a day's effort: https://github.com/Andon13/glvs。您可以根据该原则自己编写某种验证器。
有许多 OpenGL Loading Libraries 可以在某种程度上满足您的需求。 GLEW 只是给你一切,让你挑选你想要的。但是还有其他一些生成更具体的加载程序。
GL3w 例如仅生成核心 OpenGL 函数,完全忽略扩展。
为了更全面的解决方案,有glLoadGen or GLad. Both of these are generators for the headers and loading code. But both of them allow you to specify exactly which version of OpenGL you want and exactly which extensions you want. GLad even has a web application可以生成headers并下载到您的计算机。
为了完全公开,我写了 glLoadGen。