【URP】Android上URP失效

前言

这篇主要是讲一下最近遇到在android上urp不生效的问题。

正文

在ab中资源不一致

问题原因

在做功能的时候,因为贪图方便,所以在pass里处理过的rt直接渲染保存到resource中的rt上,然后在ui上就直接使用这张resource上的rt。当把这个ui做成ab之后,就会发现ui上使用的rt是黑的。通过打印这两个rt的GetInstanceID之后发现,这两个id是不一样的。其实这个很好理解的,因为在打ab的时候,是会把当前这个ab所依赖的资源在不打包成ab的时候,会生成一份放在这个ab里,所以在这步的时候,这个ui所依赖的rt就已经和resource的rt不一样啦。为啥会出现resource里的资源不能被ab资源所依赖,而会产生冗余的资源呢?我的理解就是因为ab是属于一个单独的资源系统,他其实是可以脱离untiy单独使用的,它的使用场景可能和打ab的unity工程不是同一个,所以不能保证ab的使用场景一定能有resource的资源。

解决办法

  1. 在pass里保存的rt直接通过代码新建一个,然后在ui里直接调用这个rt去显示。
  2. 直接把urpasset的资源和所依赖的资源都打成ab包。

renderTexture 格式问题

问题原因

在通过新建RenderTexture去解决上面那个显示资源部一致的问题时,发现这张rt在有的时候会出现纹理不能写入。我通过把rt保存到手机里发现这张rt是一张全透的图片。

解决办法

  1. 修改创建RenderTexture的Depth为0可解决。

UI刷新问题

问题原因

因为在截屏处理rt的时机是我们在打开UI界面的时候,所以当Features处理完设置好rt的时候,我们的UI是不会做刷新的。

解决办法

  1. 设置一个回调函数,当Features处理好RT已经保存结束,回调到ui上调用SetMaterialDirty来强制刷新

结束

在android上显示urp失效找了我一个礼拜的时间,其实核心的问题都很简单,但是因为是多个原因混合在一起导致的问题,所以在找线索的时候花了很长时间。在查找问题的时候,我们首先需要明确问题出现的点,在这个问题,因为是多个问题混合在一起出现的,首先我先确认一点,就是相机的纹理是否能获取到;这里我做的事情就和写代码做一些日志输出一样,我把相机问题保存在手机里。然后很幸运,这个纹理是有的;这就能解决我很大的一个顾虑,不是urp底层问题。后面就开始查为啥显示不出来,就一个节点一个节点的输出保存。ui上使用的rt是不是有纹理,获取之后纹理为啥没有更新。这样一点一点查,最后就解决掉。遇到问题不能害怕这个问题,而是要做一次拆分,去了解功能的每个关键节点;去看看这些节点是不是有问题。