LWRP光照贴图异常

LWRP光照贴图异常

1)LWRP光照贴图异常
2)Unity Sprite Packer图片资源重复打包
3)VideoPlayer在Android部分机型的播放问题
4)如何利用ShaderVariantCollection正确地收集Shader变体
5)实时阴影的强度


这是第168篇UWA技术知识分享的推送。今天我们继续为大家精选了若干和开发、优化相关的问题,建议阅读时间10分钟,认真读完必有收获。

UWA 问答社区:answer.uwa4d.com
UWA QQ群2:793972859(原群已满员)


SRP

Q:最近尝试使用Unity的LWRP,在导出安卓包看效果的时候发现烘焙的光照贴图全都错乱了。不知道大家有没有遇到这个情况。

下面是不同设备上的运行截图:


(编辑器)


(黑鲨)


(魅族 m1 metal)


(魅族 m1 metal 不使用LWRP)

测试工程我也放到GitHub上了:https://github.com/YimiCGH/LightmapTest/tree/LightMap_LWRP

两个分支,master是普通项目,另一个是使用LWRP。不知道是设置的问题还是什么原因导致的,没什么头绪。望各位指点指点!

A:听说可能和轻量级管线的SRP batcher有关,或者是Vulkan有关。然后就尝试去掉SRP batcher,再导出包,结果这几个设备上都可以正常显示了。


(SRP batcher 还处于实验性阶段,用来合并相同Shader的材质)

看了我的Unity版本是2019.1 ,可能版本还不支持。

感谢题主YimiChen@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5d26f756f5990425a29d0395


Texture

Q:项目快上线了,用Sprite Packer整理图集,但是在打包过后,包体大了5MB(Windows平台, 压缩包从20MB -> 25MB)。

例如:有三张倍场的图片,放到了一个图集下,打包之后查看日志,发现图集和图集的三张图片也打进去了。

用同版本的Unity新建另外一个项目进行测试,并没有这个问题,只会打包图集,不会单独打包子图片。

PS:当前项目是几个月前从5.6.6升级到2018.2.1的(不知道跟这个问题有没有关系)。

A:项目使用Sprite Packer打图集时,图集中的图片不能被RawImage引用。如果被引用,则会另外打包一份此资源,造成同一张图片,存在两个地方,包体增大。也就是说,RawImage就不要引用Sprite格式的图片,如果一定要引用,那也不要把这个图片打入图集。

感谢题主蒋晓昌@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5d2c4112fbb5b1259d93e625


Loading

Q:VideoPlayer在Android部分机型播放到部分时,整个画面静止。我这边用的是VideoPlayer播放视屏的,视屏格式为Mp4,大小68MB,放在本地。是通过设置的VideoPlayer的URL来播放的,没有放到AssetBundle,用的RenderTexture。

然后在Android部分机型上面,会播放到某帧时,整个画面静止。但是音频有在继续播放。请问有遇到过这种情况吗?该怎么解决呢?(Unity版本 2018.4.2)

A:应该是我们视频质量太高了,直接从外包拿过来的,自己没有处理压缩下。

原视频长宽:1920x1080,总比特率:10198kbps,帧率:25帧/秒。文件大小68MB。总时长:53秒。

自己用格式工厂压缩了下:长宽:1280x720,总比特率:2568kbps,帧率:20帧/秒。文件大小16MB。总时长:53秒。

然后再放到手机上,没发现卡住问题。

感谢题主逃逸速度@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5d25f8c7f5990425a29d0391


Shader

Q:如何利用ShaderVariantCollection正确的收集Shader变体。

计划:

1、利用一个空场景加载所有的Material,以便利用Project Settings/Graphics中的功能来收集所有用到的shader_feature,并将他们收集到指定的一个ShaderVariantCollection中。

2、再将multi_compile(需要运行时动态使用的变体)添加到上面的ShaderVariantCollection中。

3、将Shader与ShaderVariantColellection打在一个AseetBundle包中。

4、游戏启动时加载这个AseetBundle包,并执行Warmup,期望一次性将所有用到的变体解析掉,以便解决后续的卡顿感。

理想的计划是以上这几步,不知是否是最优?另外主要是第2步,如何才能把multi_compile中的变体也添加进去呢?每次收集前跑一遍游戏也不实际。

A1:multi_compile理论上不用加到变体收集。所有的都加入到ShaderVariantCollection中执行一次,Warmup时间会比较长。建议细分&精简Shader,同时按需Warmup。

1、如果使用不频繁的,颗粒度比较小的,可否考虑将Shader&材质放入一个AssetBundle包中,这样可以避免手动收集,同时消耗也可以忽略不计。

2、Shader本身做一次检查。就我们目前项目而言,Shader写的很冗杂,很多变体都是多余产出,考虑精简。

3、针对性收集。例如可能游戏中大量的特效都是在战斗中,那可以考虑针对战斗单独收集,然后单独Warmup,避免一次性Warmup时比较耗时,尤其游戏初始化本身比较耗时的情况下再加上Warmup的时长会显得很滞顿。
感谢私念@UWA问答社区提供了回答

A2:我们项目的做法是根据材质拿到Shader的文本信息做语法解析multi compile后面的关键字。

变体比较多的时候Native内存消耗和游戏第一次启动时间需要考虑可以适当剪枝。

感谢晨星@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5d2f0ac1f5990425a29d0458


Render

Q:实时阴影通过Strength调到1还是觉得不够暗,有没有什么方法可以调的更暗呢?

A1:1、在Lighting界面把环境光调小,不过这样整体都会变暗;
2、修改间接光的计算方法。
感谢凯奥斯@UWA问答社区提供了回答

A2:楼上应该是最正统的做法。补充我们项目之前用过一个trick的方法,是直接在Shader里面把有atten值的地方压低,包括间接光的部分。比较直接又不会动到其他的效果。

感谢王宇@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5d1b4570fa2ecc3655227674


今天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题也许都只是冰山一角,我们早已在UWA问答网站上准备了更多的技术话题等你一起来探索和分享。欢迎热爱进步的你加入,也许你的方法恰能解别人的燃眉之急;而他山之“石”,也能攻你之“玉”。

官网:www.uwa4d.com
官方技术博客:blog.uwa4d.com
官方问答社区:answer.uwa4d.com
UWA学堂:edu.uwa4d.com
官方技术QQ群:793972859(原群已满员)