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

时间:2018-07-23 14:59:18

标签: c++ opengl optimization vertex-shader

我有很多顶点着色器,它们使用不同的顶点组件。一些处理非常大的顶点(位置,4个uv通道,2个颜色通道,法线,骨骼权重),而另一些使用小顶点(仅以位置和法线为例)。

即使在着色器中不存在该属性,我是否可以设置(与glBindAttribLocation()一起使用)在每个着色器中使用相同的index不影响性能< / em>?

例如:

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 个答案:

答案 0 :(得分:4)

您可以将任何内容传递给glBindAttribLocation。要做的就是定义如果VS输入匹配这些名称的位置。您甚至可以将同一位置分配给多个不同的名称,只要两个名称都不会出现在着色器中即可。

生成的编译着色器将不受外部绑定的影响。

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