glGetActiveUniformName的意外行为

时间:2013-02-19 22:21:40

标签: c++ opengl opengl-3

glGetActiveUniformName是一个函数,可用于根据 documentation 查询GLSL制服的名称长度。这可以通过将 uniformName 设置为NULL(0)并将 GLsizei 指针作为输出变量提供给 length 来完成。在执行此操作时,可以期望在 length 参数中返回统一名称的长度,但在调用上述函数后此变量未更改。给出的错误是GL_INVALID_VALUE,根据文档,这可能意味着以下三种情况之一:

GL_INVALID_VALUE is generated if uniformIndex is greater than or equal to the value of GL_ACTIVE_UNIFORMS.

GL_INVALID_VALUE is generated if bufSize is negative.

GL_INVALID_VALUE is generated if program is not the name of a program object for which glLinkProgram has been issued.

在我的情况下, uniformIndex 为0,GL_ACTIVE_UNIFORMS报告5. bufSize 有意设置为0,因此不能为负数。在所使用的程序上使用GL_LINK_STATUS调用glGetProgram返回GL_TRUE(1)。这排除了此错误的所有3个已知原因。还有刚刚在调用glGetActiveUniformName之前根据glGetError,并用有效的调用它已经没有以前的错误的由bufSize uniformName 的都成功,没有错误,并在 uniformName 按预期;正确地写了制服的名字。

除了不报告制服名称的长度和错误之外,还有其他令人不安的迹象;如果 bufSize 设置为大于零的正值且 uniformName 保留为NULL(0),则该函数无论如何都会写入 uniformName ,可能导致严重记忆腐败。此行为不符合规范,其中指出 uniformName 应为NULL(0),然后不应写入任何内容。

将上述所有信息放在一起我认为我可以安全地得出结论,我的代码中没有错误,但在我自己的代码之外的地方有一个错误,这就是我在这里发布的原因。是否有人可以在如上所述使用时验证此功能的行为?

我认为这很可能是一个驱动程序问题,这意味着只有运行nVidia驱动程序/硬件的人才会看到问题,但现在要排除任何用户组还为时过早。

P.S。:上面发生在安装了nVidia GeForce 660 GTX的运行最新驱动程序(专门更新以验证上述声明)的机器上。该机器是运行64位Windows 7 Professional SP1的Dell XPS 8500。该程序是使用Visual Studio 2012 Professional构建的,已完全更新。这篇文章也发布在nVidia开发者论坛和DevMaster上,发布在这里以便更好地曝光并希望更快地解决问题。

更新1:有问题的代码在具有不同GPU(nVidia GeForce 9600M GT)的另一台机器上进行了测试,再次使用最新的驱动程序并提供了相同的结果。本机运行的是64位Windows 7旗舰版SP1。二进制文件再次使用VS2012构建。

1 个答案:

答案 0 :(得分:2)

这里的文档似乎不对。这里的OpenGL规范非常清楚:length用于实际写入缓冲区的字符数。此外,规范不需要对uniformName参数进行任何NULL检查。

或者,换句话说,您无法使用glGetActiveUniformName来获取制服名称的长度。您必须使用glGetActiveUniform

执行此操作

我已经更正了documentation on the wiki