how it works?
在一次渲染之前,three会给每一个支持阴影的灯光做一次渲染
这些渲染和照相机类似, 模拟灯光 的相机看到的内容
在此期间,material 会被替换成 MeshDepthMaterial 获取深度(depth) 越远就越黑(模糊)
这些灯光渲染的内容将被保存为一个阴影贴图,然后这些阴影贴图将会被应用到支持
阴影(开启receiveShadow)的material中去,然后投影到几何体上
需要遍历每个object是否投射阴影和接收阴影,尽可能少的开启阴影
shadows map 就是 灯光看到的图像的纹理
如果有 100 个灯,就会产生 100个 shadow map,这就是灯光耗费性能的原因
renderer.shadow.enabled = true 渲染shadow map
只有 点光源 平行光 聚光灯才能产生阴影
产生阴影很简单,怎么优化阴影才难
mapSize.set() 改变阴影贴图大小
可以查看 阴影 light.shadow.map / camera 等信息
默认情况下 阴影大小 是 512 * 512 这是阴影贴图的宽和高,越大效果越好
必须使用 2的次方 大小 这也有 mip mapping
聚光灯: near / far 控制产生阴影的范围,这要在这个范围内才会有产生阴影
平行光: 是正交相机
设置 top / bottom / left / right 缩小相机的范围 有些地方不需要也没必要产生阴影
这样相机的范围小了之后,就可以获得更大的内容 和更多的细节 就越清晰了
如果有一些值过小,比如 far ,得到的阴影可能会被裁减,因为远的地方不会产生阴影
设置阴影模糊 radius 和光源远近无关
阴影贴图算法 有很多种(主要任务就是鉴别出点是否在阴影中)设置在renderer上 renderer.shadowMap.type =
BasicShadowMap 性能好,失去质量
PCFShadowMap 默认
PCFSoftShadowMap 比上一个好点,性能更高 最好二选一,不支持radius
VSMShadowMap 更高的性能 而且可能会有意想不到的结果
聚光灯性能提升
多个灯光共同产生的阴影不太好看,也不太真实,所以最好不要在同一个位置产生多个阴影
同样需要修改 mapSize 来 越大阴影越清晰
因为它是一个透视相机,可以改变角度 fov far near
点光源相关
相机是一个方向 朝下的 透视相机
实际上不太准确,因为它向四周发光 6个方向(上下左右前后) 就像环境贴图一样,help显示的是最后一个方向的照相机所看到的
6次渲染为每个方向,这就是电光源最耗费性能的原因
无法控制 fov 因为6个方向都有,所以不要去改变 fov,否则可能会有问题
仍然可以控制 near / far
多个光照射在同一个地方产生多个阴影,效果并不是那么好,需要使用其他方法
Baking Shadows:阴影被baking 在texture 中
先关闭阴影功能,它只是不会产生阴影了,但是还是有光照的效果,有照亮的范围
用已经制作好的 一个阴影贴图,然后在 plane 上加上 map 贴图
使用普通材质即可,但是问题是当移动物体时,无法改变
baking shadows alternative 不如上面那个真实
2个平面不同带下完全处于一个 平面就会造成 闪烁,因为不知道渲染哪一个层级(z-fighting)
把它放在球体的下面,然后跟着球体 左右移动
要使用 alphaMap,因为需要改变 opacity
如果球体上升,就降低透明底opacity,下降就增加透明度
创建一个率高于地面的平面,用普通材质就可以了
baking可以对各个物体 结合起来用,不用的场景使用不同的方式
鬼屋
Fog(color, near, far)
near 和 far 是距离照相机的远近 在这个区间才有雾的有效范围
当小于near 事不会有雾的,大于 far 就完全 不透明 看不见了
解决 草地的边 很明显的问题
设置 setClearColor 解决 plane四边形 太明显问题 和fog的颜色一样即可
优化 shadow near / far