首页 > 解决方案 > OpenGL,着色器中未使用的阴影贴图是否不好?

问题描述

在你的着色器代码中有这样的东西是个坏主意吗?

uniform sampler2DShadow shadowMaps[8];
uniform int numShadowMaps;

有了这个可以有一个通用着色器,适用于从 0 到 8 个阴影贴图的所有情况。或者有 8 个不同的着色器和硬编码的阴影贴图编号会更好吗?

标签: openglglsluniform

解决方案


这个问题实际上并不是性能问题,而是占用了这么多的绑定点。许多实现只允许 16 个纹理绑定点(每个着色器阶段),因此您会将其中的一半仅用于阴影。即使它们未被使用,它们仍在占用这些资源。

最好使用 2D 数组纹理阴影贴图采样器 ( sampler2DArrayShadow)。您仍然可以有一个制服来告诉您有多少阵列层填充了有用的数据。

另外,这样您就不会将限制硬编码到着色器中。因此,如果您决定阴影贴图的上限仅为 6 或应该扩大到 10,则不必更改着色器代码。

当然,缺点是阵列纹理的所有层必须具有相同的大小。所以如果你需要你的一些阴影贴图更小,你不能这样做。


推荐阅读