使用 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;