Unity - URP Shader在打包AssetBundle后丢失变体问题排查

前言:工程在打AB包模式后,运行结果模型的软阴影失效

一. 查看是否shader打AB包后丢失变种

分别使用AB包模式和本地资源模式运行程序,并做一下步骤

本地资源模式

步骤1:

        打开Frame Debug分析器

4ea17e902e276825ceadd5c7c0188104.png

步骤2 :

        查看Frame Debug中RenderCamera节点下的Objects渲染

        选中SPR Batch 查看右侧信息中的Keywords

58f800244425a6d2d1f949e34a4defd3.png

 

AB包模式

 

d461562c2b064acb58dfa19009718fbb.png

 

明显能够看到,AB包模式中没有 _SHADOWS_SOFT 这个变体

这也就是为什么AB包模式运行后模型的阴影没有软阴影的原因

 

二. 通过AssetStudio排查在shader.ab内编译后的Shader文件,是否能够找到这个变体,确定这个变体实际上是否在包内

后续补充

 

三.解决方案

情况1:

在进行单元测试中,在一个空项目中打包uber.shader,发现打包后,变体正确。

但是开发项目和打包项目依旧生成不正确。怀疑是Unity缓存原因。

于是删除Library目录下shaderCache,再次打包,还是不正确。

再次删除已生成的AssetBundle资源,完全重新生成,终于正确。

所以multi_compile定义的关键字打包出现问题,需要删除缓存和已生成的AssetBundle才能最终正确生成新的AssetBundle。

 

情况2:

将Shader中的shader_feature还原成multi_compile形式

遍历场景收集变体的时候Editor是PC平台,只考虑了开启阴影+Cascade的时候的变体。

所以PC上同时存在_MAIN_LIGHT_SHADOWS和_MAIN_LIGHT_SHADOWS_CASCADE关键字,表现是正常的。

而Android机器上没开启级联阴影,所以只有这个关键字_MAIN_LIGHT_SHADOWS,其实变体没有收集到。

 

情况3:

也是我遇到的情况

我的项目在母包里(项目中)会有一份默认的UniversalRendererPipelineAsset

然后在AssetBundle中会存在多份不同情况下的UniversalRendererPipelineAsset

然而SoftShadow的勾选应用是在AB包里的URPAsset上的,默认的URPAsset上没有勾选SoftShadow

由于Unity在构建编译时,只会根据母包里(项目中)的所有资源来获取所用到的shader变体,才会被计入包体中,而其他的变体就会被当做未使用而被自动剔除掉(就像我这里遇到的:所有AB包里的资源所用到的shader变体是不会被Unity检测到的,因此被剔除了)

参考地址记录:【精选】如何动态获取URP设置里自定义的RenderFeatures_unity 动态开启 feature-优快云博客 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值