阴影(shadow)
球体表面的也有阴影,一边亮 另一边暗,这是 core shadow
怎样产生 drop shadow ,这个一直是实时渲染的挑战,因为需要考虑性能问题,还需要考虑是否真实。shadow 需要有一个好的 frame rate
光线追踪在blender中非常耗性能,一次渲染可能需要几个小时
three 内置的阴影不是那么完美,却使用简单
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