【问题标题】:Fixing GLSL shaders for Nvidia and AMD为 Nvidia 和 AMD 修复 GLSL 着色器
【发布时间】:2013-07-16 23:44:52
【问题描述】:

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

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

我知道,最终,测试是唯一确定的方法,但在开发过程中,我希望至少能避免明显的问题。

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

【问题讨论】:

  • 你得到什么样的错误?主要使用 opengl4.x/glfw/glew 我必须修复函数指针。假设 glGenVertexArrays 适用于 AMD 但不适用于 Nvidia。所以你需要检索函数的地址:glGenVertexArrays = (PFNGLGENVERTEXARRAYSPROC) glfwGetProcAddress("glGenVertexArrays");

标签: opengl glsl shader nvidia


【解决方案1】:

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

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

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

【讨论】:

  • 此外,如果您可以将某些内容识别为错误或违反 OpenGL 规范,并且可以提供可靠的测试用例,请提交错误报告。从最终应用程序开发人员那里获得反馈是 GPU 供应商有效解决驱动程序、固件甚至硬件问题的唯一途径。
  • 您实际上可以做的另一件事是使用glGetShaderInfoLog 检查警告。我发现 NVidia 驱动程序对它所接受的内容非常宽容,但它确实对它编译的(至少部分)不可靠的 GLSL 发出警告。
  • 好的,感谢您的明确回答,即没有简单的工具可以检查着色器是否对两家供应商有效。 @GuyRT我已经在检查ShaderInfoLog,它在我的机器(AMD)上什么都没有,但在我朋友的电脑(Nvidia)上,应用程序因着色器编译错误而崩溃。我只是想知道是否有比让他向我发送异常详细信息更好的方法。
  • 好的,我在读出glShaderInfoLog 时犯了一个小错误。现在我至少收到了一些警告。
【解决方案2】:

可以选择使用 NVidias 的 NVEmulate 和 AMD 的 GPU ShaderAnalyzer。

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

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

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

【讨论】:

  • 请提供更多细节;就目前而言,这不足以回答。
  • ShaderAnalyzer 是否真的与它捆绑了一个 GLSL 编译器?我认为它与驱动程序的编译器接口,这就是它需要 Catalyst 驱动程序 >= 12.x 的原因。不过,他们从不费心对其进行更新,因此它不会为 Radeon HD 7xxx 或更新的 GPU 生成 GLSL 程序集:-\ 就 HLSL 编译器而言,它当然不包括这个 - 微软是唯一编写 HLSL 编译器的一方, D3D 驱动程序实际上使用已编译的字节码并将其转换为目标 GPU 的本机指令。
  • 是的,ShaderAnalyzer 捆绑了 GLSL 编译器,它可以在我的 Nvidia 卡上完美运行......问题是关于 GLSL。由于 HLSL 编译器仅由 Microsoft 提供,因此通常不会出现这样的问题......只要真的想要(出于某种原因)使用 d3d 进行开发
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-21
  • 1970-01-01
  • 2012-05-10
  • 1970-01-01
相关资源
最近更新 更多