zoukankan      html  css  js  c++  java
  • 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

    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/

  • 相关阅读:
    hadoop面试时的一些问题解答
    FTRL(Follow The Regularized Leader)学习总结
    循环神经(LSTM)网络学习总结
    深度学习中常用的激活函数
    TF.learn学习
    TensorFlow实现分布式计算
    TensorFlow TensorBoard使用
    深度学习总结
    Spark SQL相关总结
    推荐系统/广告系统索引目录
  • 原文地址:https://www.cnblogs.com/hont/p/5781930.html
Copyright © 2011-2022 走看看