【问题标题】:When using the same Vertex shader in different programs, does the uniform location persist在不同程序中使用相同的顶点着色器时,统一位置是否保持不变
【发布时间】:2013-07-26 04:16:51
【问题描述】:

对不起,如果这是重复的,我似乎找不到可靠的答案。

如果我在多个程序中使用相同的顶点着色器,假设 getUniformLocation 保持不变是否安全?

例如,如果我在多个程序(A、B、C、D)中使用以下顶点着色器:

uniform mat4    uMvp;
attribute vec3 aPosition;

void main() {
             vec4 position = vec4(aPosition.xyz, 1.);
             gl_Position = uMvp * position;
 }

在初始化时我要调用

 GLUint mvpLoc = getUniformLocation("uMvp"); 

在使用程序 A 时,我可以安全地切换到程序 B/C/D 并继续使用 mvploc 吗?我对 GLES 2.0 相对较新,从表面上看,这似乎是一种不好的做法,但我认为调用 getUniformLocation 时会有开销,这是可以避免的。

我已阅读有关 glBindAttribLocation 的信息,因此我可以使用它并将 uMvp 作为属性,但后来我觉得我错过了一点,因为通常的做法似乎是将 mvps 作为统一变量。

【问题讨论】:

    标签: opengl-es glsl shader


    【解决方案1】:

    不,每个程序程序对象将具有单独的统一位置。无法保证两个不同的程序使用相同的位置来购买相同的制服。

    除非您可以访问 ARB_explicit_uniform_locations 或 GL 4.3(您没有,因为您使用的是 ES)。这允许您在着色器中明确指定统一位置。

    【讨论】:

    • “无法保证两个不同的程序使用相同的位置来购买相同的制服。”只是它们是完全独立的对象,具有不同的内部状态。如您所说,您需要为两者指定制服:)
    • 这是我的想法,但是大多数时候不只是使用 glBindAttribLocation 的论点是什么,在大多数情况下使用它似乎更有帮助,例如模型视图矩阵
    • @chrispepper1989:每个顶点的属性都会改变。您可以使用 glVertexAttrib 为 4x4 矩阵使用 4 个每个顶点属性。但是它的性能特征将是未知的(因为大多数人不这样做)。另外,你一般只能得到16个属性total,你会严格限制你可以使用的“制服”的数量。
    • 我认为设置某种形式的 ShaderObject 类是一种很好的做法,它将保存每个统一变量的位置
    • 不,本地 tizen。 “着色器对象”类方法似乎比较流行(从我遇到的一些例子来看)所以我可能会坚持这一点,尤其是在 Nicol Bolas 的评论之后
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-16
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多