Unity - 搬砖日志 - RenderDoc 分析为何 UGUI ScrollView 下 Stencil 不能与 其他 3D 层的对象有交互?(Mask 组件的问题)

文章目录

  • 问题
  • 解决方法


问题

之前做过一些实验,直接放一些:Image 和 ParticleSystem

  • 修改 Image 的材质,让其 Stencil Always 写入 1
  • 修改 ParticleSystem的材质,让其 Stencil Equals 1 才通过

Image 材质
Unity - 搬砖日志 - RenderDoc 分析为何 UGUI ScrollView 下 Stencil 不能与 其他 3D 层的对象有交互?(Mask 组件的问题)_第1张图片

ParticleSystem 的材质
Unity - 搬砖日志 - RenderDoc 分析为何 UGUI ScrollView 下 Stencil 不能与 其他 3D 层的对象有交互?(Mask 组件的问题)_第2张图片

经过上面的配置后,实现 UGUI 简单的 Image 与 ParticleSystem 的 Mask 交互效果,如下图:

  • 红色线条的内容表示:是正常的效果
  • 黄色线条的内容表示:不正常的效果

Unity - 搬砖日志 - RenderDoc 分析为何 UGUI ScrollView 下 Stencil 不能与 其他 3D 层的对象有交互?(Mask 组件的问题)_第3张图片

正常的效果,与不正常的效果,区别在于:

  • ImageMaskPSImage 组件 GameObject 对象没有添加 Mask 组件
  • ImageMaskPS_WithMaskCompImage 是添加的 Mask 组件

当时我唯一的怀疑就是:Mask 组件会再绘制完子对象后会 重新的 绘制自己一遍,并将 原来的 Stencil 重置了

抱着怀疑的心态,我使用了 RenderDoc 来查看了绘制过程,显示找到了 绘制的 EventID
Unity - 搬砖日志 - RenderDoc 分析为何 UGUI ScrollView 下 Stencil 不能与 其他 3D 层的对象有交互?(Mask 组件的问题)_第4张图片

每个 Event ID 对象的绘制
Unity - 搬砖日志 - RenderDoc 分析为何 UGUI ScrollView 下 Stencil 不能与 其他 3D 层的对象有交互?(Mask 组件的问题)_第5张图片

发现其中的猫腻:
Unity - 搬砖日志 - RenderDoc 分析为何 UGUI ScrollView 下 Stencil 不能与 其他 3D 层的对象有交互?(Mask 组件的问题)_第6张图片

EID : 814-828EID : 838-844 的绘制网格的都是同一个(意思那个带有 MaskImage 组件会绘制两次)

第一次,是 Stencil Write 的部分:(如下图,只看绿色箭头的部分)
Unity - 搬砖日志 - RenderDoc 分析为何 UGUI ScrollView 下 Stencil 不能与 其他 3D 层的对象有交互?(Mask 组件的问题)_第7张图片

第二次,是 Stencil Clear 的部分:(如下图)
Unity - 搬砖日志 - RenderDoc 分析为何 UGUI ScrollView 下 Stencil 不能与 其他 3D 层的对象有交互?(Mask 组件的问题)_第8张图片

的枚举可以参考 MSDN 上的 DX11 文档又描述:
D3D11_STENCIL_OP enumeration (d3d11.h) - 查找:D3D11_STENCIL_OP_ZERO 即可
Unity - 搬砖日志 - RenderDoc 分析为何 UGUI ScrollView 下 Stencil 不能与 其他 3D 层的对象有交互?(Mask 组件的问题)_第9张图片

所以,这就导致了在后续的 ParticleSystem 中,无法显示的原因了(因为 ParticleSystem 要 Stencil Equals 1 的才显示,但是因为被 Mask 清理之后,导致后续那部分的像素对应的 Stencil 都被重置为0了,那么,后续的 ParticleSystem 的 Stencil Test 肯定是不成功的)


解决方法

不使用 Mask 组件,但是也是需要在适当的地方清理 Stencil 值,这样我们可以在头尾不添加 Stencil Write, Stencil Clear 的 Image,再调整对应的 Sorting Layer, Order In Layer, RenderQueue 来配置绘制顺序的控制,即可达到我们想要的 UI & 3D 层级的对象的绘制时 Stencil 交互的效果了

你可能感兴趣的:(unity,unity,搬砖,unity-shader,Stencil,Unity,Mask,组件,Mask不能与特效遮罩,Stencil,被清理了,RenderDoc)