旧版的ATI显卡提示“HW不支持片段着色器”的OpenGL问题

4
在我们的OpenGL游戏中,ATI Radeon x800显卡出现了着色器链接失败的问题。 glGetProgramInfoLog 报告如下:
Fragment shader(s) failed to link,  vertex shader(s) linked.
Fragment Shader not supported by HW

通过一些搜索,我发现我们可能因为一个非常长的片段着色器而达到了ALU指令限制。有没有办法验证这个问题?

我找不到x800的详细规格,也找不到在运行时查询指令限制的方法。即使我能查询到它,那么该如何确定我的着色器指令数呢?

2个回答

3

你可能会遇到几个限制:

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

从技术上讲,X800是一个着色器模型2 GPU,与GLSL 1.20提供的内容相当。当我开始使用Radeon 9800进行着色器编程时,X800在技术上只是一个升级版的9800,我很快放弃了使用GLSL的想法。它太受限制了。就像计算机资源和能力有限时经常发生的情况一样,出路是使用汇编语言。在这种情况下,我指的是ARB_fragment_program扩展提供的汇编语言。


确实无法确定从GLSL开始的指令计数吗? - Luca

3

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

与当前GPU相比,x800的着色器功率非常有限。为了实现适当的性能,您可能需要在此低端GPU上减少着色器复杂度。如果您的GLSL版本已经运行,那么选择不同的片段着色器可能是最明智的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接