MODERN OPENGL不能改变glDrawArrays调用之间的统一值

时间:2016-01-31 18:28:10

标签: python opengl pyopengl

编辑:我刚刚通过pip重新安装PyOpenGL来解决这个问题。现在,同一程序按预期工作。感谢您的努力。

整个问题已被重写并澄清。

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

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

一旦调用了glDrawArrays(),似乎系统的值就会被锁定。之后,我只能在清除颜色缓冲区时再次更改它们。

我愿意为任何有效的解决方案提供赏金。在我看来,发布任何源代码都没有帮助,因为问题似乎不在于代码。

任何建议都是适用的。

1 个答案:

答案 0 :(得分:3)

您可以更新绘制调用之间的制服,以及它们的使用方式。

查看粘贴的代码,并且正如评论中所指出的那样,第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状态中的其他内容导致统一更新未显示在屏幕上,例如深度测试是一个常见的罪魁祸首。