代码之家  ›  专栏  ›  技术社区  ›  xXliolauXx

MODERN OPENGL无法在glDrawArrays调用之间更改统一值

  •  5
  • xXliolauXx  · 技术社区  · 9 年前

    编辑:我刚刚通过用pip重新安装PyOpenGL成功解决了这个问题。同一程序现在按预期工作。谢谢你的努力。

    整个问题被改写和澄清。

    问题不在于(尽管奇怪)纹理创建和绑定方法,如评论中所解释的。

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

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

    我愿意为任何可行的解决方案提供奖励。 在我看来,发布任何源代码都无济于事,因为问题似乎并不在于代码。

    欢迎任何建议。

    1 回复  |  直到 9 年前
        1
  •  3
  •   dognotdog    9 年前

    你可以在抽签之间更新制服,这就是他们的使用方式。

    查看粘贴的代码,正如注释中所指出的,第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状态中的其他原因导致统一更新没有显示在屏幕上,例如,深度测试就是一个常见的罪魁祸首。