如何确保我的Windows OpenGL应用程序具有向后兼容性?

3

我开发了一个程序,使用了许多OpenGL的方面——从新功能到废弃功能都有涉及,并希望确保它在绝大多数机器上能够正确运行——尤其是在旧图形卡上。

  • 最大化OpenGL应用程序的(向后)兼容性的最佳方法是什么?
  • 如何测试我的程序是否与旧硬件兼容,而不需要真正拥有一台旧硬件的测试机器?
  • 有哪些方法可以找到在兼容性测试期间可能遇到的问题的根本原因?
2个回答

2
如何最大化OpenGL应用程序的(向后)兼容性?
定义“兼容性”?如果您想让应用程序在尽可能多的硬件上运行,则基本上必须完全放弃着色器,并坚持使用GL 1.4左右版本。主要的混淆问题是Intel驱动程序存在缺陷;许多旧Intel硬件将声称支持GL 2.0或2.1,但这种支持具有无数缺陷。
如何测试我的程序是否与较旧的硬件兼容而没有实际拥有较旧硬件的测试机器?
不行。与旧硬件的兼容性不仅涉及坚持标准。还涉及确保您的程序不会遇到驱动程序缺陷。唯一的方法就是在相关硬件上进行实际测试。
有哪些方法可以找出在兼容性测试期间可能遇到的问题的根本原因?
在最近的硬件上测试同样的代码。如果有相同的失败,则问题很可能在您的代码中。如果在最近的硬件上正常工作但在旧设备上失败,则问题几乎肯定是旧硬件驱动程序的错误。
开发解决方法。

关于“旧硬件和驱动程序”问题,我想补充一点,很多图形开发人员会囤积大量旧的、过时的显卡。比如我的收藏品可以追溯到GeForce 2和Radeon 9500,并涵盖了每个主要GPU发布之间的一个型号。然而,现在我不再为Shader Model 3以下的任何内容进行开发了。 - datenwolf

1

嗯,最大化向后兼容性并追踪目标机器功能的最佳方法(在我看来)是使用类似GLEW:OpenGL扩展包装库的东西。它将为您加载特定于OpenGL版本的函数,并且您可以测试用户系统(或更正确地说,视频驱动程序)是否支持它们。

这个库非常易于使用,文档齐全,您可以通过谷歌搜索到很多示例。因此,如果目标机器没有一些新的OpenGL函数,则加载名为“opengl_old.cpp”的模块(例如),或者如果它没有某些已弃用的功能(如 glBegin() glEnd()),则最好使用“opengl_new.cpp”继续进行。

基本上,大部分变化都发生在OpenGL 3.0(以及更进一步的3.3)中,引入了着色器作为唯一的非弃用图形管道,因此您可以在程序中创建两个OpenGL模块:一个用于OpenGL 1&2,另一个用于OpenGL 3&4。至少我在自己的代码中是这样解决这个问题的。

要测试某些功能,您可以在创建上下文时指定要加载的OpenGL API的具体版本。


1
着色器自2.0版本以来一直是OpenGL的核心功能。 - Nicol Bolas
Nicol Bolas,谢谢您!我已经更正了我的答案,以便更准确地表达我的意思。 - mexus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接