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

时间:2012-09-26 10:56:07

标签: opengl compatibility backwards-compatibility

我开发了一个程序,它利用了OpenGL的许多方面 - 从新的功能到新功能,并且希望确保它在大多数机器上正常工作 - 特别是在具有过时图形卡的机器上。 / p>

  • 最大化OpenGL应用程序(向后)兼容性的最佳方法是什么?
  • 如何测试我的程序与旧硬件的兼容性,而不使用旧硬件的测试机器?
  • 有哪些方法可以找到兼容性测试期间可能遇到的问题的根本原因?

2 个答案:

答案 0 :(得分:2)

  

最大化OpenGL应用程序(向后)兼容性的最佳方法是什么?

定义“兼容性”?如果您希望应用程序在尽可能多的硬件上运行,那么您基本上必须完全放弃着色器并坚持使用GL 1.4。这里主要的混淆问题是英特尔驱动程序错误;许多旧的英特尔硬件将声称支持GL 2.0或2.1,但它们在此支持中有无数的失败。

  

如果没有使用旧硬件的测试机器,我如何测试我的程序与旧硬件的兼容性?

你没有。与旧硬件的兼容性不仅仅是坚持标准。这是为了确保您的程序不会遇到驱动程序错误。而这样做的唯一方法是实际测试感兴趣的硬件。

  

有哪些方法可以找到兼容性测试期间可能遇到的问题的根本原因?

在最近的硬件上测试相同的代码。如果它有相同的失败,那么问题可能在您的代码中。如果它在最近的硬件上工作正常但在旧的东西上失败,则问题几乎肯定是旧硬件驱动程序的驱动程序错误。

制定解决方法。

答案 1 :(得分:1)

那么,最大化向后兼容性并获得跟踪目标机器功能(imho)的强大工具的最佳方法是使用GLEW: The OpenGL Extension Wrangler Library之类的东西。它将为您加载OpenGL版本特定的功能,您可以测试它们是否受用户系统支持(或者更准确地说,是视频驱动程序)。 这个库使用起来非常简单,它有很好的文档,你可以google很多例子。 因此,如果目标机器没有一些新的opengl函数,你可以加载名为“opengl_old.cpp”的模块(例如),或者它没有一些已经弃用的功能(比如 glBegin() glEnd()),你最好继续使用“opengl_new.cpp”。

基本上,大多数更改都是在OpenGL 3.0(以及3.3)中完成的,并且着色器是唯一不推荐使用的图形管道,因此您可以在程序中创建两个opengl模块:一个用于OpenGL 1& 2,一个用于OpenGL 3和4。至少我在自己的代码中以这种方式解决了这个问题。

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