Unity-The Courtyard Demo学习
该demo主要是演示unity GI有关的内容,并且演示了PRGI在昼夜切换下的使用。
作者是Alex Lovett。作者的博客干货很多,地址是:
http://www.shadowood.uk/Store/Store/
unity官网的文章目前缺失状态:
https://blogs.unity3d.com/cn/2015/11/05/awesome-realtime-gi-on-desktops-and-consoles/
所以我找了另一个博主的文章:http://blog.csdn.net/hcud024/article/details/51360084
The Courtyard Demo博主备份百度网盘地址(最终版):
链接:https://pan.baidu.com/s/1_-LIPGqOMUHocVK5qC4Qkw
提取码:4fn9
1.PRGI的相关配置
在烘培PRGI的时候,可以设置不同的参数改变烘培速度和品质,具体可以看这篇http://www.cnblogs.com/hont/p/6399790.html
然后通过GI相关的通道查看贴图,此demo主要是针对分辨率进行设置,并对阶梯的照明表现进行优化。官方文章讲的很详细,这里不多说了。
Lightmap Parameters文件全部位于GI Settings目录下,对于GI参数的设置也非常重要
除了Roof其余都勾选了Edge stitching,这个选项会影响到UV边缘的接缝效果
Floor分为3个Lightmap Parameters文件,区别是分辨率。
CurvedWall,Emissive这些对光照传递要求比较高的区域,ClusterResolution参数设置的比较高
每一个Cluster块都是储存光照信息的具体单元,值越大Cluster区域越密集,得到的光照效果也就越精确。
其余部分根据细节要求分别设置了不同精度的参数
场景方面。Props分为了完全静态和非静态两种,其余物体全为静态。
Props分类里中小型物体比较多,可以通过光照探头来提供光照信息,从而加快构建速度。
(这一点在unity的光照优化教程中有提及:https://unity3d.com/cn/learn/tutorials/topics/graphics/introduction-precomputed-realtime-gi?playlist=17102)
2.光球的自发光问题
Demo中光球的自发光,是通过灯光实现,而非实时的自发光。
不过我后来在AgentProperties.cs 这个脚本里发现了一处更新全局光照的调用:
if (myRenderer == null) myRenderer = GetComponentInChildren<Renderer> (); if (myRenderer != null) { if (m_PropertyBlock == null) m_PropertyBlock = new MaterialPropertyBlock (); m_PropertyBlock.SetColor ("_EmissionColor", colorin * 7.8f); myRenderer.SetPropertyBlock (m_PropertyBlock); DynamicGI.SetEmissive (myRenderer, colorin * 7.8f); }
其中这一行比较可疑
DynamicGI.SetEmissive (myRenderer, colorin * 7.8f);
因为静态对象调用这个接口是可以改变所影响发光处的颜色的。但对于动态对象改这个其实并没有用
和朋友讨论无果后,我决定发邮件问作者,作者回复很快。大意是:
可能什么也没做,放在这是出于完整性考虑。如果未来可以支持在动态网格上使用
3.光照探头的分布与脚本生成
项目中有一个脚本LightProbesTetrahedralGrid,可以生成环状的光照探头
代码中只需要对其position数组进行设置即可,不过对于光照探头中存储的球谐光照数据似乎不是很好修改
public void Generate () { LightProbeGroup lightProbeGroup = GetComponent<LightProbeGroup> (); List<Vector3> positions = new List<Vector3> (); m_TriangleProps = new TriangleProps (m_Side); if (m_InnerRadius < kMinInnerRadius) GenerateCylinder (m_TriangleProps, m_Radius, m_Height, m_Levels, positions); else GenerateRing (m_TriangleProps, m_Radius, m_InnerRadius, m_Height, m_Levels, positions); lightProbeGroup.probePositions = positions.ToArray (); }
另外需要注意,光照探头一定要放在不同光源的光照变化处,这样才会有比较好的效果。
如果难以摆放,建议改用平均分布。
4.Bloom光斑
光斑使用的是Bloom自带的特效,而非Flare组件
对于某些风格的游戏,这么用效果还不错
5.天空盒
和unity自带的程序化天空盒不同,虽然支持昼夜切换,但效果比较难调
并不能直接通过修改平行光位置直接切换cubemap。
6.编辑器相机同步脚本
The Courtyard的demo中,会发现Scene视图和Game视图是编辑器下同步的,它通过一个CopySceneView.cs脚本实现
Scene视图和Game视图的显示效果还是有区别的,毕竟有相机滤镜。同步后可以更好的调试
7. 关于相机滤镜
相机中加了两个异性过滤滤镜,以及两个AO滤镜。确实有点粗暴
8.编辑器丢失脚本查看脚本
其中还附带了一个丢失脚本查看脚本,位于目录Editor/MissingReferencesFinder下
9.补充
这篇文章写的比较早,起初较为简陋
近期由于想研究下PRGI的昼夜变化支持,又把此demo打开看了一下
发现疏漏甚多,所以对文章内容再一次加以修改。
项目中有一个Shadowood的文件夹,其中是作者自己的一些后期效果
以及半兰伯特光照的Standard shader扩展
个人觉得影响不大,也不算项目核心,并没有深入研究。
本来想研究一下灯光组件的使用以及优化,不过demo中没有发现什么特殊的地方,Lighting所占用的Batches依然很高
和Corridor Lighting Example一样,将一部分MeshRenderer的CastShadow设成了off。不过这应该算不上什么技巧
平均每个镜头1700个DC(batches),反射大约占用400,光照和阴影占用700。
扩展阅读:
unity全局光照文档:https://docs.unity3d.com/Manual/GIIntro.html
Light Probe光照探头介绍:https://blogs.unity3d.com/cn/2011/03/09/light-probes/
另一篇unity昼夜切换的文章:http://www.eastshade.com/creating-a-dynamic-sky-in-unity/