Unity5.x 灯光烘焙GI和LightingMap

GI是什么? GI =直接光照+间接光照+环境光+反射光.
直接光照先不用说了,
间接光照是光线在物体上反射所带来的光照. 核心参数: 每个光源上的Bounce Intensity.
环境光可以直接理解为你天空盒的颜色, 蓝天白云, 那么环境光就是蓝色白色. 核心参数: Lighting视图中的Ambient Intensity.
反射光可以理解为镜面反射一样的存在, 核心参数: Lighting视图中的Reflection Intensity
请各位逐一尝试这四个参数并且尝试能将场景调成纯黑然后再调回来, 就能理解其中的概念了.


GI分为两种, 一种是Precomputed Reatime GI, 这种GI需要预先计算, 计算场景中所有的Static物体的信息, 并且允许在运行时任意修改光源的Bounce Intensity或者移动光源的位置. 所有的变化都是实时的.
第二种是Baked GI, 这种GI不会预先计算但会进行预先烘焙, 无法像Precomputed Realtime GI那样在运行时更改光源.


GI的重点在于Bounce , 可以将Static物体上的光反弹到其他Static物体上, 无法将非Static物体上的光反弹到Static物体上. 也无法将Static物体上的光反弹到非Static物体上, 但是Unity5引入了新的概念, 那就是Realtime的LightProbe, Unity4中的LightProbe只能静态烘焙, 而Unity5的LightProbe会实时捕捉包括Precomputed Realtime GI的Bounce光在内的任何光线信息并且将其赋予非Static物体上.


要想完全理解GI, 首先要好好说一下Lighting面板.

Unity5.x 灯光烘焙GI和LightingMap

先说重点的Scene页面.

Unity5.x 灯光烘焙GI和LightingMap

Environment Lighting这些内容控制的是场景总体的光线信息, 包括天空盒的设置, 可以赋予一个天空盒材质上去, 而天空盒材质在Unity5里面也有更新, 很有意思, 大家可以试试, 新建一个材质然后选择Skybox/Procedural就行了.
Sun---如果你的天空盒材质是Skybox/Procedural那么这里允许指定一个Directional Light, 你试着旋转一下这个Directional Light就知道他是干嘛的了.
Ambient Source---环境光来源, 一般都是天空盒. 如果你的天空盒会在游戏运行时实时变化, 一定要在Ambient GI这里选择Realtime, 否则可以选择Baked.
Reflection Source---镜面反光的来源, 说到镜面放光, 需要说到Reflection Probe, 可以理解为Reflection Probe会规定一个区域, 任何进入这个区域的物体的镜面反光的信息都会被覆盖, 而没有进入任何Reflection Probe的物体的镜面放光的信息就是这个Reflection Source所指定的内容.
Reflection Bounces---当你使用Reflection Probe的时候, 最多允许镜面来回反弹几次, 举个例子, 两面镜子对着放, 会有无穷的发射次数, 而这显然是有性能消耗的, 这里指定这个来回反弹的最大的次数.

Unity5.x 灯光烘焙GI和LightingMap



Unity5.x 灯光烘焙GI和LightingMap

Precomputed Realtime GI的概念是, 预先计算场景中的所有静态物体的信息, 具体计算出来了哪些信息咱们开发者不用操心, 这些计算出来的信息会用于实时GI.
Realtime Resolution控制的是实时GI的分辨率, 建议不要调太高.

Unity5.x 灯光烘焙GI和LightingMap

CPU Usage这个越大, 在调节Realtime光源的时候, GI效果就会响应得越快。

Unity5.x 灯光烘焙GI和LightingMap


Baked GI就是烘焙光影贴图的内容了. 可以和Precomputed Realtime GI同时存在.
Baked Resolution---Bounce效果的分辨率, 由于是Baked的, 所以不用像Realtime那样设置得很小.

Unity5.x 灯光烘焙GI和LightingMap


Baked Padding---防止光照贴图的像素在物体之间溢出. 是物体之间而不是UV簇之间, Unity没有智能到可以自动帮我将一个物体的UV拆开来然后再合并. 

Unity5.x 灯光烘焙GI和LightingMap

Compressed---是否压缩光照贴图, 提高性能, 缩小容量, 但画质会降低.
AO -- 环境光遮蔽:是来描绘物体和物体相交或靠近的时候遮挡周围漫反射光线的效果,可以解决或改善漏光、飘和阴影不实等问题,解决或改善场景中缝隙、褶皱与墙角、角线以及细小物体等的表现不清晰问题,综合改善细节尤其是暗部阴影,增强空间的层次感、真实感,同时加强和改善画面明暗对比,增强画面的艺术性

Unity5.x 灯光烘焙GI和LightingMap

Final Gather---开启后效果的确有很大的提升, 但是会让烘焙变慢, 成品必开.

Unity5.x 灯光烘焙GI和LightingMap

Ray Count---与Final Gather有关. 该值越大效果越好. 烘焙也越慢. 经过仔细对比, 默认的1024和4096几乎没有区别, 但4096烘焙得出奇地慢. 事实上1024和128也几乎没有区别. 反正在我的小测试场景中是几乎没有任何区别.


Unity5.x 灯光烘焙GI和LightingMap


General GI组的这些参数同时适用于实时GI以及烘焙GI.
Directional Mode -- 定向光照

Non-directional: 非定向光照图,使用单个光照贴图,存储有关表面发射多少光的信息,是纯粹的漫反射。 以这种方式点亮的物体将显得平坦。

Directional:定向光照图,存储有关照明环境的更多信息,而不向非定向光照图。 着色器可以使用关于入射光的额外数据来更好地计算出射光,这是材料在屏幕上的出现。 但是定向模式使用两倍于非定向模式的纹理内存,并具有稍高的阴影成本。

Unity5.x 灯光烘焙GI和LightingMap

图中是静态物体+Bake光源. 可以看到如果选择了Directional, 会像Unity4一样对静态物体处理得很不好, 但如果选择了Directional Specular, 画质马上就提升了一个等级. 
不仅对于静态物体+Baked光源有提升, 对于静态物体+Realtime光源也有提升. 但是对于动态物体是没有提升的.

Unity5.x 灯光烘焙GI和LightingMap


这两幅图是静态物体+动态光源. 可以说Directional Specular直接提升了静态物体对于直接光和间接光的效果.
但是这里有一个不得不重视的警告, 说Directional Specular对于SM2.0以及GLES2.0无法支持. 如果选择了Directional Specular, 就说明我不得不在我的PC游戏的最低配置上提升需求(当然了要是在八年前是要这么说的)! 这里说一下GLES(OpenGL ES)和SM(Shader Model). OpenGL ES针对手机平台, SM针对主机和PC平台. 从iPhone5s开始支持了OpenGL ES 3.0版本. 而对于SM版本来说, 目前还停留在SM2.0的显卡基本已经不存在了. 


Indirect Intensity---间接强度,同时调节Bounce, 静态物体的自发光对其他物体的影响, 以及ambient lighting的强度.

Bounce Boost--反弹光照提升,提升物体的光照反弹的强度。

Default Parameters---设置一个LightmapParameters资源上去. 这么做是为了复用性.
Atlas Size---Atlas尺寸.

Unity5.x 灯光烘焙GI和LightingMap

Fog 组合Other Settings组的内容都是Unity4就有了的. 新功能教学中不赘述.


下面来看一下Lighting窗口的Object页面:

Unity5.x 灯光烘焙GI和LightingMap

Preserve UVs以及Auto UV Max Distance以及Auto UV Max Angle--- 说到这三个UV选项, 就不得不说一个新的知识点.
每个物体在Unity中最多会使用3个UV通道, UV1是贴图通道, UV2是光照贴图的通道, 而第三个UV是Unity自动生成的要用于Precomputed Realtime GI的UV通道.

 Unity5.x 灯光烘焙GI和LightingMap

在这里会看到区别, 其中最后两个, 使用了光照贴图的UV通道, 而前面五个使用了第三个UV,
而这三个参数正是用于控制如何生成这第三套UV的. 这三个选项自己测试一下就有结论了, 不再赘述. 说到这里, 如果你坚持看到这里还没有打开Unity手动进行测试并且记笔记的话, 我推荐你不要这样. 我不是专门写教程的我无法写得很好如果你不能一边测试一边看教程你说不定什么都学不到.


Important GI---在比较大的场景里面, Emission物体够大够亮. 但有些物体没有却没有被他照射到, 那么可以为他开启这个Important GI.

Unity5.x 灯光烘焙GI和LightingMap


好了, 这里要说一下Emmision了, 在第一章里, 我们说到了两种自带PBS的Shader都有Emmision可以用, 

Unity5.x 灯光烘焙GI和LightingMap

重点: 要想Emmision影响其他物体, 那么Emmision物体必须是Static的. Realtime和Baked的区别在于, Realtime允许在游戏运行时更改Emmision颜色以及强度来影响整体GI, 当然了更改了Emmision颜色之后需要调用一个API, 这个API就是DynamicGI.UpdateMaterials, Unity官方文档说, 之所以没有做成自动刷新显示是因为这方面的刷新比较消耗性能, 而Unity正在想办法将这个操作的性能消耗减少并且将这个做成实时刷新的.


Advanced Parameters---允许单独的物体的LightParameter的设置覆盖Default Parameters. 

Unity5.x 灯光烘焙GI和LightingMap

下面说LightmapParameters,为了复用性, 将LightmapParameters做成了资源.

Unity5.x 灯光烘焙GI和LightingMap


LightmapParameters资源可以赋予全局, 或者赋予单个物体来覆盖全局中的设置.

Unity5.x 灯光烘焙GI和LightingMap

Precomputed Realtime GI这组的都是与Precomputed Realtime GI相关的.
Resolution---Realtime Resolution会乘以这个值来得出最终要使用于实时GI的Resolution.
Cluster Resolution---Too large clusters will result in light/shadow bleeding and too small clusters slow down the precompute. 数值越小效果越精确, 但是烘焙起来也越慢.

Unity5.x 灯光烘焙GI和LightingMap

什么是Cluster? 看图

Unity5.x 灯光烘焙GI和LightingMap


Irradiance Budget---数值越小效果越平滑. 但是更加消耗内存和少量的CPU.

Irradiance Quality---数值越大效果越好, 但是预计算越慢. 对游戏运行时的性能消耗无影响.

Backface Tolerance---数值越小, GI就越容易无视物体的背面. 同时, 两个完全贴合的物体的贴合部分也越容易被GI无视.

Modelling Tolerance---数值越小效果越好但是不能是0.

Edge Stitching---不能说完全消除但是可以缓解UV接缝的视觉纰漏.

Is Transparent---还记得刚才说过什么吗? LightmapParameters资源可以赋予全局, 或者赋予单个物体来覆盖全局中的设置. 没错, 为透明的物体赋予可以覆盖全局设置的LightParameters, 并且将这个LightParameters中的这个Is Transparent开启是更好的选择.

Unity5.x 灯光烘焙GI和LightingMap

System Tag---和Is Transparent一样, 使用单独物体的LightParameter来确定这个物体被考虑进哪个System. 说到System, 可以理解为Precomputed Realtime GI的Atlas. 

Unity5.x 灯光烘焙GI和LightingMap


Baked GI这里的选项都是针对Baked GI的.

Blur Radius---光照贴图的模糊处理. 可用于将烘焙出来的阴影进行柔化处理.
Anti-aliasing Samples---数值越高, 烘焙出来的阴影的锯齿越少.
Direct Light Quality---数值越高烘焙效果越精确. 烘焙时间也会更长.

Unity5.x 灯光烘焙GI和LightingMap

Baked AO这组是与AO有关的参数.
Quality---数值越高AO的质量越高.
Anti-aliasing Samples---AO抗锯齿.

Baked Tag---这个参数虽然和Baked AO组离的很近, 但是注意观察其实是有一定Space的, 因此他不属于AO组. 控制光照贴图的Atlas编号.


Over。。。