【问题标题】:glGetUniformLocation returning the same value for all programsglGetUniformLocation 为所有程序返回相同的值
【发布时间】:2016-05-14 19:30:15
【问题描述】:

我们有几个不同的 opengles2.0 着色器,每个着色器都使用不同的制服。我们使用 glGetUniformLocation 来获取每个制服的数据写入位置。然而,这意味着当我们切换着色器程序时,例如,有时我们会将相机矩阵写入一个位置,有时写入另一个位置,这一切都取决于为该着色器定义了哪些制服。这意味着我们不能通过检查要上传的值是否已更改来轻松减少冗余着色器统一上传,因为我们可能需要重新上传它以覆盖由不同着色器为不同统一写入的值。

虽然我知道可以在每个着色器程序中包含相同的制服,但无论是否使用它们,glGetUniformLocation 是否会为每个程序返回相同的位置?或者,例如,着色器编译器可能会删除未引用的制服并将其余部分捆绑在一起,从而导致每个着色器将其制服放在不同的位置。这适用于 IOS 和 Android。

谢谢

肖恩

【问题讨论】:

    标签: android c++ ios opengl-es-2.0


    【解决方案1】:

    制服是每个节目的状态,因此它们的位置是否因不同节目而不同并不重要,因为如果您想避免多余的制服更改,那么您需要在每个节目的基础上而不是全局上跟踪制服就像使用 DirectX9 一样。

    是的,即使您在每个编译单元中都有完全相同的制服,OpenGL 也可能会删除未使用的制服或以其他方式重新排列它们。

    【讨论】:

    • 好的,所以如果一个程序从 glGetUnifiormLocation 返回位置“10”,我在那里写了一个浮点值“99”,然后我切换到另一个程序,它返回了位置“10”。否则,我在那个位置写“88”,在使用第二个程序时,如果我切换回来,“99”仍然会被设置为原始程序吗?即它们是独特的位置,还是共享的?
    • 是的,当您切换回第一个程序时,99 仍然存在。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-15
    • 2018-11-08
    • 1970-01-01
    • 1970-01-01
    • 2019-09-03
    • 1970-01-01
    相关资源
    最近更新 更多