首页 / three.js / 使用示例
软阴影 VSM
一排高低不同的板与几根细柱,投影落在同一片地面上。 VSM 让影子边缘出现连续过渡,模糊采样数与半径可以分别调整。
源码与运行效果
VSM 与 PCF 的区别
PCF 在着色时对阴影贴图取多个邻近样本做平均,边缘的软硬由采样核决定。 VSM 则把方差信息写进贴图,渲染阴影前先对整张贴图做多次模糊, 边缘的柔和程度由模糊半径与采样数共同决定。
因此 VSM 的模糊是一次性的,与场景里物体的数量无关;PCF 的成本则随阴影接收面积增长。 大范围地形投影时,VSM 通常更稳。
| 参数 | 取值 | 作用 |
|---|---|---|
blurSamples | 2 – 24 | 模糊采样数,越大越平滑也越慢 |
radius | 1 – 10 | 模糊半径,决定半影宽度 |
shadowMap.type | VSM | 渲染器级别,需在渲染前设定 |
bias | -0.0008 | 抑制自阴影条纹 |
漏光的副作用
半径调得过大时,薄物体的影子会变淡甚至消失,两块靠近的物体之间的暗部也会被填亮。 这是方差估计在小样本下的固有问题,不是参数写错了。
工程上的做法是把半径控制在刚好够用的范围:让影子边缘有一两像素的过渡即可, 继续增大只会得到「到处发白」的画面。
改参数后要通知阴影重算。VSM 的模糊在阴影贴图生成阶段完成,
修改 blurSamples 或 radius 之后,
需要把 shadow.needsUpdate 置为真,否则新参数要等到下一帧才可能生效。