c++ - glGetActiveUniformName 的异常行为

标签 c++ opengl opengl-3

glGetActiveUniformName 是一个函数,可用于根据 documentation 查询GLSL uniform 的名称长度。 。这可以通过将 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 个已知原因。根据 glGetError,在调用 glGetActiveUniformName 并使用有效的 bufSizeuniformName 调用它之前没有之前的错误都成功无误并写入 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 Ultimate SP1。同样,二进制文件是使用 VS2012 构建的。

最佳答案

这里的文档似乎有误。 OpenGL规范在这里很明确:length是实际写入缓冲区的字符数。此外,该规范不需要对 uniformName 参数进行任何 NULL 检查。

或者,换句话说,您不能使用 glGetActiveUniformName 获取制服名称的长度。您必须使用 glGetActiveUniform 执行此操作。

我已经更正了 documentation on the wiki .

关于c++ - glGetActiveUniformName 的异常行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14968677/

相关文章:

c++ - 引用变量和指针问题

c++ - 泛型类中的多态性在 C++0x 中不起作用

c - 通过保持光源固定来旋转 OpenGl 中的金字塔

opengl - 在 OpenGL 3/GLSL 130 中设置线宽

opengl - 为什么索引缓冲区对象没有 glVertexAttribPointer?

c++ - 如何检查 ButtonGroup Id 并根据该 ButtonGroup id 更改另一个按钮

opengl - 为什么应该使用外部 OpenGL 加载器函数而不是 GLAD 的内置加载器?

c++ - 基本 GL 函数 glTranslatef 似乎不起作用

c++ - 带有纹理的卡通着色器

c++ - "using Time = cppClassDefinition<withT>"的 Cython 等价物