-
光的来源 分为 直接光 与 间接光
-
照射到 物体上 会产生 漫反射 与 镜面反射
-
直接光 的 漫反射 (用 光源方向位置 与 物体顶点法线 计算) 产生 物体的 亮部
-
直接光 的 镜面反射 ( 光源位置方向 物体顶点法线 视线方向 ) 产生 物体的 高光
-
间接光 的 漫反射 为物体 整体 进一步 变亮
Ambient 就是最简单的 一种
更真实的 是 根据 物体周围 的物体颜色 计算 -
间接光 的 镜面反射 即 为物体的 环境反射
一种 实现方式是 环境贴图 -
加上 物体产生的 阴影, 上述 四种 着色的 顺序是
亮部 -> 阴影 -> 间接光 -> 环境反射 -> 高光 -
亮部 与 高光 一般 为 实时计算, 高光 无法 离线(烘焙), 因为与视线有关
-
镜面反射 也不能 为 烘焙, 常用处理手段有
Reflaction Probe
SSR( Screen Space Reflection )
Matcap -
阴影 可以实时 处理, 也可以用 烘焙光照贴图 实现, 实现手段有
LightMap
ShadowMask
Distance ShadowMask -
间接光的漫反射 (也就是所谓的GI), 实现方式有
光照探头
Light Probe Group
Light Probe Proxy Volume
烘焙光照贴图
BakeGI / MixGI
烘焙动态光照信息
Realtime GI (预烘焙实时GI)
ref: https://zhuanlan.zhihu.com/p/158589986
-
Light Probe (灯光探头)
实现原理是 在 光源 或 自发光物体的 周围(或其他需要的地方) 撒上 一堆 探测球, 在 预处理阶段, 探测球会 根据 光源 计算自己所在位置的 灯光信息,
当 动态物体 渲染时 会 实时寻找 靠近自己最近的 一个或多个 探测球 的颜色 差值 后 作为自己的 光照信息
关键点:
实时作用于 动态物体
动态物体应该尽量小, 太大 会导致 光照信息 计算失真 -
Realtime GI
实现原理是 预处理阶段 计算出 静态物体定点 的光照信息(包含了光线反弹信息), 但并不计算具体的颜色, 只记录收影响的程度
运行时 根据 灯光颜色和强度 与 预处理阶段 计算出的 程度信息 来 计算最终的 颜色值
关键点:
作用于 静态物体
允许灯光颜色,强度等信息 实时变化, 但位置信息 不能再变化了 -
Baked GI
原理是 使用 光照贴图的 方式, 即 预处理阶段 烘焙出一张 贴图, 贴图中记录的是 光照信息(包含了光线反弹信息), 会计算出最终的颜色
因此 运行时 灯光信息(颜色, 强度, 位置) 不能改变, 作为贴图 作用在物体上
关键点:
作用于 静态物体
灯光 与 物体 的所有信息都不能改变
ref: https://www.bilibili.com/video/BV1Hs411G7n7?spm_id_from=333.337.search-card.all.click
- Unity 中有两种 GI 光照方式, 分别为 “实时GI” 和 “BakeGI”
“实时GI” 参考 [13]
“BakeGI” 参考 [14], 它又有三种模式
Bake Indirect: 烘焙间接
它只烘焙间接光照, 而 直接光和阴影 都是 实时计算, 比较吃性能
Shadowmask: 阴影遮罩
它处了烘焙间接光照, 还会将静态物体产生的阴影烘焙到 Shadowmask 中, 需要多一份纹理, 少了一些实时运算
substrative
它会将静态物体的 直接光 间接光 和 阴影都作烘焙, 性能消耗最小
ref: https://www.bilibili.com/video/BV1J44y1g7w5?p=84&spm_id_from=pageDriver
- Unity 中 RealTimeGI 和 BakedGI 可以同时开启
开启方法:
在 Lighting 面板的 [Scene] 页签 下的 [Realtime Lighting] 分组中 勾选 [Realtime Global Illumination] 可开启 RealTimeGI
在 Lighting 面板的 [Scene] 页签 下的 [Mixed Lighting] 分组中 勾选 [Realtime Global Illumination] 可开启 BakedGI
可以从 Lighting 面板的 [RealTime Lightingmaps] 和 [Baked Lightmaps] 查看项目中 烘焙的 RealTimeGI 纹理 和 BakedGI 纹理
同时 需要 修改 Light 的 Mode 参数 为 Bake 或 Mix