如果在着色器中未使用绑定属性位置,是否会有惩罚?

Is there a penalty for binding attribute locations, if they are unused in a shader?

我有很多使用不同顶点组件的顶点着色器。一些处理相当大的顶点[位置、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
...

我担心的是,如果着色器使用的组件很少,但未使用的组件处于活动状态,或者使用的组件处于非传染性指数,则该着色器将不得不为未使用的组件付费。

你可以传递任何你想要的东西给glBindAttribLocation。如果 VS 输入与这些名称相匹配,那么所做的就是定义这些位置。您甚至可以将同一位置分配给多个不同的名称,只要这两个名称都没有出现在着色器中即可。

生成的编译着色器不会受到无关绑定的影响。

话虽如此,您确实应该使用 layout(location = #) 语法将这些东西放入着色器本身。