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 时失败

Intel/AMD C++ 上的 OpenGL 3+ 失败

NVIDIA 卡上不同的 OpenGL 帧缓冲区 RGBA 值

OpenGL 缂栫▼鎸囧崡 (9.2)

OpenGL - 在 NVIDIA 卡上渲染到纹理时出现 FBO 黑屏

Nvidia显卡上的阴影粉刺