Unity Q&A 第6期 :光照烘焙的最佳实践
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将在10月22-26日,举办为期5天的专业的Unity官方教师培训课程,诚邀广大教师与Unity一同学习分享最新技术!
报名地址:
https://connect.unity.com/events/2018jiaoshipeixun
Unity近期将在南京、南昌、上海开展重磅教育活动,欢迎教育领域的领导、专家、教师团队莅临交流!
现在访问Unity在线商店(store.unity.com),成功订阅Unity Pro专业版、Unity Plus加强版即可享受全新增值服务组合。11月18日之前订阅,更有指定插件资源限时赠送。
活动地址:https://store.unity.com/cn
点击“阅读原文”访问Unity官方中文论坛