确保GLSL兼容性

时间:2011-08-11 06:46:12

标签: c++ opengl compatibility glsl shader

如何确保GLSL着色器与大多数现代卡兼容?

我有一个软件,我使用here的GLSL代码。但即使我在最终着色器的开头添加了#version 120并确保它编译,在某些用户计算机上它们会出现着色器编译错误(即使它们支持OpenGL 3.2)。

是否有任何工具可用于“验证”或尝试使用不同的“着色器编译器”进行编译?

2 个答案:

答案 0 :(得分:6)

没有用于验证着色器的工具。即使有,但它对你没有用,因为如果它不能在你想要的硬件上运行,那么着色器有什么用呢?您可以随心所欲,但如果您的硬件拒绝它,即使您在技术上正确,您的着色器仍然无法运行。

如果特定版本的着色器在一个目标上编译(称为A)而不在另一个目标上编译(称之为B),则可能是由于以下问题之一:

  1. 目标A未正确实施GLSL。它允许您编译规范不允许的内容。更符合标准的目标B(或者至少是不同的不兼容)拒绝您的着色器,因为您的着色器不符合规范。
  2. 目标B不符合规范。你正在为它提供一个合法的着色器,它正拒绝它。
  3. 目标B不支持着色器使用的GLSL版本(这不太可能),除非:
  4. 目标B使用的是OpenGL核心规范,版本3.2或更高版本。 GLSL 1.20着色器不能在核心3.2 OpenGL实现上运行。
  5. 如果您仅使用NVIDIA硬件进行开发,则更有可能发生#1。 NVIDIA使用OpenGL规范有点快速和宽松。他们会在这里和那里采取一些自由,平滑一些规范所说的不愉快的事情。它可以提供更流畅的开发人员体验,但如果着色器不在竞争对手上运行,它还有助于保持供应商使用NVIDIA硬件;)

    #3几乎不存在,但有明显的例外。您链接到Photoshop着色器,因此我认为您无法控制OpenGL上下文的创建和管理。即便如此,我仍然怀疑Photoshop会使用核心环境;他们有太多的着色器需要向后兼容。

    解决这个问题的最佳方法是测试AMD和NVIDIA硬件(如果你需要在那里运行,还要测试英特尔)。您可能不需要测试每种可能的系统组合,但选择Radeon HD卡和GeForce 200或更高版本。它们甚至不必是高端的。

答案 1 :(得分:-2)

问题是所有硬件供应商都在其驱动程序中编写自己的GLSL编译器实现。即使语言定义得很好,这也会导致着色器解析中的不一致。例如,Nvidia司机经常“原谅”某些由ATI捕获的小错误。

我认为合理的解决方案是使用Nvidia的Cg(http://developer.nvidia.com/cg-toolkit) - 这样您就可以使着色器与硬件无关,并确保它们在所有硬件上运行。