微信号:Unity-GreaterChina

介绍:Unity官方开发者平台,分享最前沿的技术文章和开发经验,精彩的Unity活动和社区相关信息.

Unity Q&A 第6期 :光照烘焙的最佳实践

2018-10-06 12:45 Unity

Unity技术支持工程师陈嘉栋定期整理出,近期在Unity官方社区交流群中比较有代表性的问题。今天我们将分享第6期的社区Unity Q&A,主要涵盖了UGUI、光照、性能分析、Shader Graph着色器视图、SRP可编程渲染管线、Compute Shader、GLES等领域。


Unity Q&A 系列回顾:

UGUI

问题01:Unity 2018.2以后的版本inputfield没办法输入部分中文字符,但是Unity 2017和Unity 2018.1.9都不存在这个问题。


回答:这是一个已知的Bug。原因是由于Unity 2018.2中将16位的C#字符截成了8位的C++字符。Unity 2018.3已经修复了该问题,后续Unity 2018.2的相关版本也会陆续进行修复。


问题02:Unity 2017.3.0 f3版本中,有一个UGUI制作的预制件,每次应用后第一个Slider总是会错位,如何处理?



回答:这是一个已知Bug,已经在Unity 2017.3.1 p1版本中修复了。建议使用Unity 2017.4 LTS版本,请参考:Unity全新的版本


光照

问题03:场景需要进行烘焙阴影动态加载,尝试了下Mixed模式下烘焙出来的Shadowmask贴图添加到光照贴图中,没办法正常显示出来,但结构已经和取数值出来的时候是一样的。Shadowmask是否需要保留光源在场景中?或者有其它方法可以动态加载Shadowmask?


回答:Shadowmask是Mixed光照模式的一种,并且它保存的是Mask信息,而不是真实的光照产生的阴影效果。在Mixed-shadowmask光照模式下,需要光照来提供直接光,再利用阴影Mask来生产阴影。



如果想要关闭光照,可以考虑使用Mixed-subtractive模式或者Bake模式,将直接光照结果预先烘焙到贴图上。


问题04:我有二个场景。第一个场景烘焙正常,第二个场景复制的第一个场景,加入了一点新的家具,再进行烘焙就都是黑的。而且场景内对象的Light probes选项也不能勾选,光照没有丢失,如何解决?



回答:不能勾选Light probe是因为物体设置了Lightmap static的flag,所以它的光照信息会烘焙到光照贴图上,而不是从Light Probe中获取。


如果是针对LOD Group的烘焙,在勾选了Lightmap static后,还是可以在模型上勾选Light probe的,这是因为LOD需要Light probe来提供间接光。


烘焙后模型变黑的问题,请按照下面步骤进行检查。

  • 首先,要确认是否为模型设置了UV2数据,这是因为烘焙时需要UV2数据。

  • 其次,检查模型的Shader中是否包含Meta Pass。

  • 最后,检查场景中的Light是否开启并正确的设定了属性,以及Lighting Window中的间接光Indirect Intensity不为0。


问题05:场景进行光照烘焙时存在速度较慢的问题,是否有一些设置上的改进或最佳实践?


回答:在Lighting设置窗口中,主要是由于Indirect Resolution的设置会影响烘焙的速度。


利用Lightmap Parameter机制可以对场景中不同的区域设置不同的烘焙参数。例如:光照变化较为低频的部分可以创建一个分辨率较低的Lightmap Parameter,以节约烘焙时间。



请参考:https://unity3d.com/cn/learn/tutorials/topics/graphics/fine-tuning-lightmap-parameters?playlist=17102


Profiler

问题06:Unity Profiler性能指标里面的SetPass Calls和Draw Call、Batches有什么区别?



回答:SetPass Call是指切换渲染状态的次数。例如:Shader中如果有多个Pass,或者是场景中有不同的Material,都会造成渲染状态切换。


Draw Call是指调用Draw的实际次数。例如:Drawarray、Drawelement,调用一次都会增加。


Batches则是会在第一次调用Draw行为的时候加1,如果此后渲染状态没有改变,则Batch的数量不再增加,但是一次Batch内可能会有多次Draw Call调用,只是渲染状态没有改变。


Shader Graph着色器视图

问题07:可否使用Shader Graph着色器视图将节点转成着色器提供Unity 2017使用?


回答:右键点击节点Copy code的选项,可以复制代码。针对根结点,则可以复制生成的全部代码。


但是不建议在Unity 2017中使用,因为Shader Graph着色器视图主要是和可编程渲染管线SRP配合使用的,SRP Shader library和UnityCG.cginc有比较大的差别。


可编程渲染管线SRP

问题08:在Unity2018中,使用Lightweight Render Pipeline轻量级渲染管线的时候,有一些Asset Store资源商店的插件资源的显示会出现错误,如何解决?



回答:传统渲染流水线的Built-in的Shader以及自定义的光照Shader目前不能在新的Lightweight Render Pipeline轻量级渲染管线中使用,LWRP有其自己的Shader。


如果是传统的Built-in Shader,则可以通过菜单选择直接升级到LWRP的Shader。但是自定义的Lit Shader会比较麻烦,目前需要手动来修改。这是因为SRP Shader library和UnityCG.cginc中有比较多的区别。


因此建议联系插件资源作者反馈,或者选择使用传统的渲染流水线。


Compute Shader

问题09:Unity的Compute Shader传递float数组一直有Bug,例如:传递float[5],C#里写ComputeShader.SetFloats是无法成功的,只有第一个float可以设置成功。


回答: 这并不是Bug,而是根据HLSL的规则,应该对数据进行对齐,以避免为计算偏移所导致的ALU开销。


因此调用带有float []参数的SetFloats,应该根据HLSL规则进行对齐,即float []应按每个数据16字节,也就是float4的形式传递。


下面的格式:

//Setup Float Array

_floatArray = new float[4*4];

_floatArray[0] = 0.25f;

_floatArray[4] = 0.50f;

_floatArray[8] = 0.75f;

_floatArray[12] = 1.00f;

传递的结果就是,(0.25, 0.5, 0.75,1)。


请参考Unity的文档中的说明:

https://docs.unity3d.com/ScriptReference/ComputeShader.SetFloats.html


GLES

问题10:我需要一个非压缩单通道格式的纹理,作为Palatte使用。使用Alpha8在某些Mali GPU手机上有问题,会变成Rgba32位格式,内存增加4倍,请问是为什么?另外R8在哪里可以进行设置?


回答:在某些Mali GPU手机上存在问题,这是由于Alpha8 texture format在OpenGL ES 3 及以上版本中被移除了,因此我们使用了GL_EXT_texture_swizzle拓展来实现类似的功能,但是GL_EXT_texture_swizzle拓展在某些Mali GPU的手机上的实现存在问题,导致该功能不能正常工作。


如果要使用R8格式,可以将Texture Type设置为Single Channel,选择Red即可。


小结

以上就是近期Unity官方社区交流群中比较有代表性的问题,其中有你关注的问题吗?


如果你也希望与Unity的技术工程师交流,欢迎加入Unity官方社区交流群:629212643 或访问Unity官方中文论坛(Unitychina.cn)!


推荐阅读


官方活动

Unity官方教师培训报名火热进行中

Unity将在10月22-26日,举办为期5天的专业的Unity官方教师培训课程,诚邀广大教师与Unity一同学习分享最新技术!

报名地址:

https://connect.unity.com/events/2018jiaoshipeixun


Unity重磅教育活动来袭

Unity近期将在南京、南昌、上海开展重磅教育活动,欢迎教育领域的领导、专家、教师团队莅临交流!


优惠活动|Unity订阅新起航,开启您的创作之旅

现在访问Unity在线商店(store.unity.com),成功订阅Unity Pro专业版、Unity Plus加强版即可享受全新增值服务组合。11月18日之前订阅,更有指定插件资源限时赠送。

活动地址:https://store.unity.com/cn


点击“阅读原文”访问Unity官方中文论坛

 
Unity官方平台 更多文章 Unity Polybrush与顶点色着色器 在Unity中创作龙卷风特效 迪士尼与Unity合作动画系列短片《大白的梦》 Unity VR\/AR项目优化技巧与工具 Made with Unity动画短片《大白的梦之数羊》
猜您喜欢 正确适配苹果ATS审核要求的姿势 0基础也行,3个月逆袭底薪2万+python大牛!?你也想要吗? 为什么你说“就差一个码农了”,我们是拒绝的 PHP 协程实现 2017,SRE 走起