问题
正常 UGUI ScrollView 中的 Viewport 对带有 Mask 组件的功能,其实就是 write stencil buffer 1
然后后续的 渲染对象 equal stencil 1 才通过而已,然后所有子对象绘制完后,会再试绘制 viewport 对应的区域重置这些像素的 stencil,具体可以查看我之前的一篇:Unity - 搬砖日志 - RenderDoc 分析为何 UGUI ScrollView 下 Stencil 不能与 其他 3D 层的对象有交互?(Mask 组件的问题)
下面是我们项目中的一个使用到 UGUI ScrollView 的某块区域,下面是 Built-in RP 下渲染是正常的:
下面是在 URP 中 自己挖坑后,显示不正常,如下:
分析
然后使用 Frame Debug 来分析
先来分析一下,Built-in RP 中正常的数据:
再来看看,切换到 URP 中的异常数据:
怎么样?发现问题在哪了吗?
OK,这里就不考验大家眼里,直接给出答案:
然后我想起了,之前在玩弄:Universal Render Pipeline Asset 和 Forward Renderer 或是 Renderer Feature 的时候,记得有一些 Overrides 是包含了 Stencil 的覆盖设置的
所以啊,我就定位大概是这个方向
如下图:
可以看到 Overrides/Stencil 的 Value == 0, Compare Function == Always
确实是和 Frame Debug 查看到渲染异常状态的数据是一直的:
解决
将上面那个:Overrides/Stencil 去掉就修复好了
挖坑起因
因为项目需要将 Built-in RP 升级到 URP
但是,我们项目算是开发得七七八八的
然后中途换的话,我之前又没去了解过 URP
所以文档啊,什么资料啊,能看的基本上都看了
但是啊,之前为了学习、研究:
我在创建的 Universal Render Pipeline Asset
资源 后,对生成的 Forward Renderer
配置资源的:
Override/Stencil
不小心勾上了,然后忘记去掉了
就导致一系列的 Stencil 问题,虽然这篇文章写着的是 UGUI Mask 无效,但其实,会对整个渲染管线中,只要 Camera 的 Renderer 设置为这个 Overrides/Stencil
够上了的相机渲染时用到 Stencil 功能都可能会异常
UGUI Mask 刚刚好是一个发现这个错误的契机