opengl - OpenGL,着色器中未使用的阴影贴图是否不好?
问题描述
在你的着色器代码中有这样的东西是个坏主意吗?
uniform sampler2DShadow shadowMaps[8];
uniform int numShadowMaps;
有了这个可以有一个通用着色器,适用于从 0 到 8 个阴影贴图的所有情况。或者有 8 个不同的着色器和硬编码的阴影贴图编号会更好吗?
解决方案
这个问题实际上并不是性能问题,而是占用了这么多的绑定点。许多实现只允许 16 个纹理绑定点(每个着色器阶段),因此您会将其中的一半仅用于阴影。即使它们未被使用,它们仍在占用这些资源。
最好使用 2D 数组纹理阴影贴图采样器 ( sampler2DArrayShadow
)。您仍然可以有一个制服来告诉您有多少阵列层填充了有用的数据。
另外,这样您就不会将限制硬编码到着色器中。因此,如果您决定阴影贴图的上限仅为 6 或应该扩大到 10,则不必更改着色器代码。
当然,缺点是阵列纹理的所有层必须具有相同的大小。所以如果你需要你的一些阴影贴图更小,你不能这样做。
推荐阅读
- javascript - Google表格根据单元格编号添加行具有值的单元格计数
- php - PHP 7.4 警告:从空值创建默认对象
- python - '\n' 符号在 python 中的工作原理
- swagger-2.0 - 开放 api 规范中的可重用参数
- kubernetes - 如何在命名空间中的作业中运行 kubectl?
- java - HomeFragment中的onBackPress时如何关闭应用程序
- vhdl - VHDL:具有可变字段长度大小的记录数组
- c++ - gcc -Wstringop-overflow 在这里抱怨什么?
- flutter - 如何在 showDatePicker 中调整文本 initialDate 的大小
- android - 如何在 Android 中通过 ViewModel 类在 Activity 和 Fragment 之间共享数据?