本文重点:
支持实时光全局光照
自发光对全局光照的贡献动画化
和LPPVs一起生效(light probe proxy volumes)
使用LOD组和全局光照相结合
不同级别的LOD之间淡入淡出
这是关于渲染的系列教程的第18部分。第17部分中总结了烘焙的全局照明之后,我们将继续支持实时GI。之后,我们还将支持光探针代理体积(LPPVs)和LOD组的淡入淡出。
从现在开始,本教程系列使用Unity 2017.1.0f3制作的。它不适用于旧版本,因为我们最终会使用新的着色器功能。
(静态LOD组和实时GI的组合)
1 实时全局光照
得益于光探针的原理,烘焙光对于静态几何体非常友好,对于动态几何体也非常适用。但是,它不能处理动态光。混合模式下的光源可以进行一些实时调整,但是太多的物体因为烘焙的间接光源,需要保持不变是显而易见的。因此,当你有户外场景时,太阳必须保持不变。它不能像现实生活中那样穿越天空,因为那样需要逐渐改变GI。
为了使间接照明能够与移动的太阳等物体一起工作,Unity使用Enlighten系统可以计算实时全局照明。除了在运行时计算光照贴图和探针之外,它的工作方式类似于烘焙间接照明。
找出间接光需要了解光如何在静态表面之间反射。问题是哪些表面可能会受到其他表面的影响,以及受到何种程度的影响。弄清这些关系是很复杂的工作,不能实时完成。因此,该数据由编辑器处理并存储以供运行时使用。然后,Enlighten使用它来计算实时光照贴图和探针数据。即使这样,它也只适用于低分辨率的光照贴图。
1.1 开启实时全局光照
可以独立于烘焙照明而启用实时全局照明。可以同时都没有,任意一个或两个都处于活动状态。通过“Lighting”窗口的“Realtime Lighting”部分中的复选框启用该功能。
(实时和烘焙的GI都启用)
要查看实时GI的实际效果,请将测试场景中的主光源模式设置为实时。由于我们没有其他光源,因此即使已启用,它也可以有效地关闭烘焙光源。
(主光源设置为实时)
确保场景中的所有对象都使用我们的白色材质。与上次一样,这些球都是动态的,其他所有都是静态几何体。
(只有动态物体接受实时GI)
事实证明,只有动态对象才能从实时GI中受益。静态对象变暗了。那是因为光探针会自动包含实时GI。静态对象必须采样实时光照贴图,该实时光照贴图与烘焙的光照贴图不同。我们的着色器尚未执行此操作。
1.2 烘焙实时GI
在编辑模式下,Unity已经生成了实时光照贴图,因此你始终可以看到实时GI贡献。在编辑和播放模式之间切换时,这些贴图不会保留,但最终会保持不变。你可以通过“Lighting”窗口的“Object maps”选项卡检查实时光照贴图,并选择静态贴图对象。选择“Realtime Intensity”可视化以查看实时光照贴图数据。
(实时光照贴图,已选择顶部)
尽管实时光照贴图已经烘焙,并且可能看起来正确,但是我们的meta pass实际上使用了错误的坐标。实时GI具有自己的光照贴图坐标,最终可能与静态光照贴图的坐标不同。Unity根据光照贴图和对象设置自动生成这些坐标。它们存储在第三个网格UV通道中。因此,将此数据添加到“My Lightmapping”中的VertexData。
现在,MyLightmappingVertexProgram必须使用第二或第三UV集,以及静态或动态光照贴图的比例和偏移。可以依靠UnityMetaVertexPosition函数来使用正确的数据。
UnityMetaVertexPosition是什么样的?
除了使用通过unity_MetaVertexControl提供的标志来确定要使用的坐标集和光照贴图外,它的工作与我们以前的操作相同。
请注意,meta pass用于烘焙和实时光照贴图。因此,当使用实时GI时,它也将包含在构建中。
1.3 采样实时光照贴图
要实际采样实时光照贴图,我们还必须将第三个UV集添加到“My Lighting”中的VertexData。
使用实时光照贴图时,我们必须将其光照贴图坐标添加到插值器中。标准着色器将两个光照贴图坐标集组合在一个内插器中(与其他一些数据复用),但是我们可以为这两者使用单独的内插器。我们知道定义DYNAMICLIGHTMAP_ON关键字时就有动态的灯光数据。它是multi_compile_fwdbase编译器指令的关键字列表的一部分。
除了