我有很多顶点着色器,它们使用不同的顶点组件。一些处理非常大的顶点(位置,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
...
我担心的是,如果着色器使用的组件很少,但是未使用的组件处于活动状态,或者使用的组件处于非传染性索引下,那么该着色器将不得不为未使用的组件付费。
答案 0 :(得分:4)
您可以将任何内容传递给glBindAttribLocation
。要做的就是定义如果VS输入匹配这些名称的位置。您甚至可以将同一位置分配给多个不同的名称,只要两个名称都不会出现在着色器中即可。
生成的编译着色器将不受外部绑定的影响。
话虽如此,您确实应该使用layout(location = #)
语法将这些内容放入着色器中。