代码之家  ›  专栏  ›  技术社区  ›  Anne Quinn

如果属性位置在明暗器中未使用,绑定属性位置会受到惩罚吗?

  •  1
  • Anne Quinn  · 技术社区  · 6 年前

    我有很多顶点着色器使用不同的顶点组件。有些处理相当大的顶点[位置,4个UV通道,2个颜色通道,法线,骨骼权重],而另一些则使用小的顶点[例如位置和法线]。

    我能(用 glBindAttribLocation() )每个组件使用相同的 index 在每个材质球中,即使该属性不存在于材质球中, 无绩效惩罚 ?

    例如:

    glBindAttribLocation(programID, 0, "p");
    glBindAttribLocation(programID, 1, "uv");
    glBindAttribLocation(programID, 2, "uv1"); // these are used only in certain shaders
    glBindAttribLocation(programID, 3, "uv2");
    glBindAttribLocation(programID, 4, "uv3");
    glBindAttribLocation(programID, 5, "n");   // commonly used across most shaders
    ...
    

    我担心的是,如果一个明暗器使用的组件很少,但未使用的组件是活动的,或者使用的组件处于非传染性索引,该明暗器将不得不为它不使用的组件付费。

    1 回复  |  直到 6 年前
        1
  •  4
  •   Nicol Bolas    6 年前

    你想通过什么都可以 glBindAttribLocation . 所做的就是定义如果vs输入匹配这些名称,那么这些位置将是什么。甚至可以将同一位置指定给多个不同的名称,只要这两个名称都不显示在明暗器中。

    生成的已编译明暗器将不受外部绑定的影响。

    既然这样说了,你真的应该把那些东西放进材质球里 layout(location = #) 语法。