OpenGL:旧 ATI 卡上的“硬件不支持片段着色器”
Posted
技术标签:
【中文标题】OpenGL:旧 ATI 卡上的“硬件不支持片段着色器”【英文标题】:OpenGL: "Fragment Shader not supported by HW" on old ATI card 【发布时间】: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 的详细规格,也无法在运行时查询指令限制。并且即使我能够查询到它,我如何确定我的着色器的指令数?
【问题讨论】:
【参考方案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 选择不同的片段着色器可能是最明智的方法。
【讨论】:
以上是关于OpenGL:旧 ATI 卡上的“硬件不支持片段着色器”的主要内容,如果未能解决你的问题,请参考以下文章
glGetTexImage() 在 ATI 卡上不能正常工作?当 miplevel > 0 时失败
NVIDIA 卡上不同的 OpenGL 帧缓冲区 RGBA 值