Pro*_*icT 3 c++ opengl compatibility shader version
最近我在不同的计算机上使用 GLSL 着色器版本时遇到了一些问题。我知道每个 GPU 对着色器都有不同的支持,但我不知道如何制作一个适用于所有 GPU 的着色器。如果我在我的 PC (GPU - AMD HD7770) 上编写一些着色器,我什至不必指定版本,但在一些较旧的 PC 或带有 nVidia GPU 的 PS 上,它对版本更严格,所以我必须指定GPU 支持的版本。
现在真正的问题来了。如果我在我的 PC 上指定例如版本 330,它可以正常工作,但在其他应该支持版本 330 的 PC 上它似乎不起作用。所以我必须重写它并使其工作。如果我切换回具有较新 GPU 的 PC,它也不起作用。
有谁知道,我必须如何编写着色器才能在所有 GPU 上运行?
编写可移植的 OpenGL 代码并不像您想的那么简单。
nVidia 驱动程序是宽松的。 您可以在 nVidia 驱动程序上摆脱很多其他系统无法摆脱的东西。
很容易意外使用额外的功能。 例如,我编写了一个针对 3.2 核心配置文件的程序,但用作GL_INT_2_10_10_10_REV顶点格式。该GL_INT_2_10_10_10_REV符号在 3.2 中定义,但在 3.3 之前不允许作为顶点格式,并且您不会因意外使用它而收到任何错误消息。
很多人开着老司机。 根据 Steam 调查,2013 年,38% 的 OpenGL 3.x 驱动程序客户不支持 3.3,即使支持 3.0 的硬件应该支持 3.3。
您将始终必须进行测试。 这是不幸的现实。
我的建议是:
始终针对核心配置文件。
始终指定着色器语言版本。
检查驱动程序版本,如果太旧则中止。
如果可以,请使用仅公开您所针对的版本中的符号的 OpenGL 标头/绑定。
获取目标版本的规范副本,并将其用作参考而不是 OpenGL 手册页。
如果可行,请编写您的代码,使其也可以在 OpenGL ES 上运行。
在不同的系统上测试。 一台 PC 可能不会削减它。如果您可以使用来自不同供应商的显卡(不要忘记英特尔的集成显卡)挖出第二台 PC,那就更好了。您可能花几百美元就可以得到一个 OpenGL 3.x 桌面,或者如果您想省钱,可以要求使用朋友的计算机进行一些快速测试。您还可以购买第二块显卡(对于支持 OpenGL 4.x 的低端显卡,价格低于 40 美元),更换它们时要小心。
商业游戏在各种系统上运行的主要原因是它们有 QA 预算。如果您能负担得起 QA 团队,那就去做吧!如果您没有 QA 团队,那么您将不得不同时进行 QA 和开发——两项工作是更多的工作,但这是您为消除错误所付出的代价。