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/

 

posted @ 2016-08-17 21:13  HONT  阅读(1022)  评论(0编辑  收藏  举报