【问题标题】:OpenGL: "Fragment Shader not supported by HW" on old ATI cardOpenGL:旧 ATI 卡上的“硬件不支持片段着色器”
【发布时间】:2011-11-19 13:44:03
【问题描述】:

在我们的 OpenGL 游戏中,我们在 ATI Radeon x800 卡上遇到了着色器链接故障。 glGetProgramInfoLog 报道:

Fragment shader(s) failed to link,  vertex shader(s) linked.
Fragment Shader not supported by HW

一些谷歌搜索表明,由于片段着色器非常长,我们可能会达到 ALU 指令限制。有什么方法可以验证吗?

我无法找到 x800 的详细规格,也无法在运行时查询指令限制。并且即使我能够查询到它,我如何确定我的着色器的指令数?

【问题讨论】:

    标签: opengl glsl


    【解决方案1】:

    您可能会遇到几个限制:

    • 最大着色器长度
    • 纹理间接的最大数量(这是最容易跨越的限制)
    • 使用不受支持的功能

    从技术上讲,X800 是一个着色器模型 2 GPU,它与 GLSL 1.20 提供的差不多。当我开始使用 Radeon 9800 进行着色器编程时,X800 在技术上只是升级后的 9800,我很快就放弃了使用 GLSL 进行编程的想法。这太有限了。就像计算机只有有限的资源和能力一样,出路是使用汇编。在这种情况下,我的意思是 ARB_fragment_program 扩展提供的程序集。

    【讨论】:

    • 从GLSL开始的指令数确实不能确定?
    【解决方案2】:

    GLview 是一个很棒的工具,可以轻松查看 GPU/驱动程序组合的所有限制和支持的 GL 扩展。如果我没记错的话,我之前使用过AMD GPU ShaderAnalyzer,它允许您查看 GLSL 着色器的程序集编译版本。 NVidia 提供与 nvemulate 工具相同的功能。

    与当前的 GPU 相比,x800 的着色器能力非常有限。无论如何,您可能都必须减少着色器的复杂性,才能让这款低端 GPU 获得适当的性能。如果您正在运行 GLSL 版本,那么简单地为 X800 选择不同的片段着色器可能是最明智的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-19
      • 2014-06-18
      • 2021-10-18
      相关资源
      最近更新 更多