1

使用 Radeon 3870HD,我遇到了 AMD 驱动程序的奇怪行为(昨天更新为可用的最新版本)。

首先,我想指出整个代码在 NVIDIA GeForce 540M 上运行没有问题,并且 glGetUniformLocation 并非一直失败。

所以我的问题是我在应用程序中使用的一个着色器程序从 glGetUniformLocation 获得了奇怪的值,而另一个着色器程序没有这样的缺陷。我在帧之间切换着色器,所以我确定它不是临时的并且与那个着色器有关。我所说的奇怪值是指 17-26,而我只有 9 件制服。我将我的接口用于着色器,然后用刚刚获得的变量查询 GLSL 变量的类型,作为副作用,我还查询了它的名称。对于我返回的所有这 17-26 个位置,名称未设置且类型相同。现在我有了调试接口的想法,该接口是单独的库,并将这些值更改为我期望的值:0-8。使用调试器我更改了这些,实际上它们在该着色器中返回了正确的变量名,并且类型也是正确的。

我的问题是,始终与 NVIDIA 以及 Radeon 上的其他着色器一起工作的代码,对于另一个以相同方式处理的着色器,怎么可能会失败?

我为此包括了接口的相关部分:

//this fails to return correct value
m_location = glGetUniformLocation(m_program.getGlID(), m_name.c_str());

printGLError();
if(m_location == -1){
    std::cerr << "ERROR: Uniform " << m_name <<  " doesn't exist in program" << std::endl;
    return FAILURE;
}

GLsizei charSize = m_name.size()+1, size = 0, length = 0;
GLenum type = 0;
GLchar* name = new GLchar[charSize];
name[charSize-1] = '\0';
glGetActiveUniform(m_program.getGlID(), m_location, charSize, &length, &size, &type, name); 

delete name; name = 0;

if(!TypeResolver::resolve(type, m_type))
    return FAILURE;

m_prepared = true;
m_applied = false;
4

1 回答 1

2

您传递给的索引glGetActiveUniform应该是一个统一的位置。统一位置用于glUniform呼叫;没有其他的。

您传递给glGetActiveUniform的索引只是一个介于 0 和返回的值之间的索引glGetProgram(GL_ACTIVE_UNIFORMS)。它用于询问存在哪些制服并检查这些制服的属性。

您的代码在 NVIDIA 上运行只是因为您很幸运。OpenGL 规范不保证统一位置的顺序与活动统一索引的顺序相同。AMD 的驱动程序不能那样工作,所以你的代码不能工作。

于 2012-04-23T09:20:23.833 回答