现代 OPENGL 无法更改 glDrawArrays 调用之间的统一值

MODERN OPENGL can't change uniform value beetween glDrawArrays calls

编辑:我刚刚通过使用 pip 重新安装 PyOpenGL 设法解决了这个问题。同一个程序现在按预期运行。感谢您的努力。

整个问题都被重写和澄清了。

问题不在于(虽然很奇怪)纹理创建和绑定方法,如评论中所述。

我的实际问题是着色器中的统一变量在调用 glDrawArrays() 期间更改(是的,从着色器外部更改)时不会更新它们的值。我通过使用不同类型的制服、不同的值并通过渲染到纹理来检查它们的值来验证这一点。

调用 glDrawArrays() 后,制服的值似乎被锁定了。之后,我只能在清除颜色缓冲区后再次更改它们。

我愿意为任何可行的解决方案悬赏。 在我看来,发布任何源代码都没有帮助,因为问题似乎并不出在代码中。

欢迎任何建议。

您可以在绘制调用之间更新制服,这就是它们的用途。

查看粘贴的代码,正如评论中指出的那样,第 167..169 行应该偶然适用于小的 texId,但你应该真正改变

glUniform1i(textureUnif, model.texId)
glActiveTexture(GL_TEXTURE0+model.texId)
glBindTexture(GL_TEXTURE_2D, model.texId)

glUniform1i(textureUnif, 0)
glActiveTexture(GL_TEXTURE0)
glBindTexture(GL_TEXTURE_2D, model.texId)

虽然因为您只使用 GL_TEXTURE0,所以您只需要在每个循环迭代中调用 glBindTexture()。纹理统一应该包含纹理单元,在这种情况下着色器没有纹理 id 的概念。

当然,这是 OpenGL,通常很难发现错误。你到底想画什么?屏幕截图会有所帮助。

很可能是 OpenGL 状态中的其他原因导致统一更新未显示在屏幕上,例如深度测试是一个常见的罪魁祸首。