在着色器代码中有这样的东西是一个坏主意吗?
uniform sampler2DShadow shadowMaps[8];
uniform int numShadowMaps;
有了这个,可以有一个通用着色器,适用于0到8个阴影贴图的所有情况。或者,如果有8个不同的着色器和硬编码的阴影贴图数字,性能会更好吗?
这个问题实际上不仅仅是占据如此多的约束点。许多实现只允许16个纹理绑定点(每个着色器阶段),所以你只使用了一半的阴影。即使他们没有使用,他们仍然会占用这些资源。
最好使用2D数组纹理阴影贴图采样器(sampler2DArrayShadow
)。您仍然可以使用制服来告诉您有多少数组图层填充了有用的数据。
另外,这样您就不会对着色器进行硬编码。因此,如果您确定阴影贴图的上限仅为6或应扩展为10,则不必更改着色器代码。
当然,缺点是数组纹理的所有层必须具有相同的大小。因此,如果您需要将某些阴影贴图缩小,则无法执行此操作。