修复了Nvidia和AMD的GLSL着色器

时间:2013-07-16 23:44:52

标签: opengl glsl shader nvidia

我无法让我的GLSL着色器在AMD和Nvidia硬件上运行。

我不是在寻找修复特定着色器的帮助,而是如何避免出现这些问题。是否可以检查着色器是否可以在AMD / Nvidia驱动程序上编译,而无需在具有相应硬件的机器上运行该应用程序并实际尝试它?

我知道,最后,测试是唯一可以确定的方法,但在开发过程中,我想至少避免明显的问题。

每个使用GLSL的人都必须遇到这些问题,为什么我找不到解决问题的好方法呢?

2 个答案:

答案 0 :(得分:5)

  

是否可以检查着色器是否可以在AMD / Nvidia驱动程序上编译,而无需在具有相应硬件的机器上运行该应用程序并实际尝试它?

没有。如果您要认真开发应用程序,那么在各种硬件上进行测试是唯一可靠的方法。如果你不认真,那么谁在乎呢。

一般来说,为小型团队处理此问题的最简单方法是完全避免这个问题。大多数驱动程序不兼容来自于尝试做一些非正统的事情:将数组作为输出/输入变量变量,将矩阵作为属性传递,使用更新的驱动程序功能等等。所以......不要这样做。只使用GLSL中的固体,安全的东西,并且几乎可以肯定地用于实际的OpenGL应用程序。

答案 1 :(得分:3)

使用NVidias的NVEmulate和AMD的GPU ShaderAnalyzer可能是一种选择。

AMD的GPU ShaderAnalyzer是一个独立的GLSL / HLSL编译器。 NVidias的NVEmulate是一种模拟软件中不同(更好)NVidia显卡功能的工具。因此,如果您有一张NVidia卡,您只需运行程序进行测试(可能使用NVEmulate模拟另一张NVidia卡)并使用ShaderAnalyser查看您的着色器是否在AMD卡上编译。

如果您的着色器在AMD上运行,它很可能会在NVidia上运行。您仍然可以使用cgc(NVidias独立Cg compiller,Cg Toolkit的一部分)对其进行测试,它将GLSL和Cg代码编译为二进制或交叉编译为HLSL。这是NVidia驱动程序用于GLSL的编译器。 奖励是您还可以看到着色器的二进制/汇编代码,这对于低级优化非常有用。

如果着色器在不同的硬件上工作(如预期的那样),没有任何工具可以告诉你。我最近发现一些新的AMD驱动程序没有正确处理默认的统一值...没有警告或错误消息......但这是一个不同的故事。 所以在某些时候你必须在目标硬件上测试你的代码。