- 问题
- 解决方法
之前做过一些实验,直接放一些:Image 和 ParticleSystem
- 修改 Image 的材质,让其 Stencil Always 写入 1
- 修改 ParticleSystem的材质,让其 Stencil Equals 1 才通过
Image 材质
ParticleSystem 的材质
经过上面的配置后,实现 UGUI 简单的 Image 与 ParticleSystem 的 Mask 交互效果,如下图:
- 红色线条的内容表示:是正常的效果
- 黄色线条的内容表示:不正常的效果
正常的效果,与不正常的效果,区别在于:
ImageMaskPS
的Image
组件GameObject
对象没有添加Mask
组件ImageMaskPS_WithMaskComp
的Image
是添加的Mask
组件
当时我唯一的怀疑就是:Mask 组件会再绘制完子对象后会 重新的 绘制自己一遍,并将 原来的 Stencil 重置了
抱着怀疑的心态,我使用了 RenderDoc 来查看了绘制过程,显示找到了 绘制的 EventID
每个 Event ID 对象的绘制
发现其中的猫腻:
EID : 814-828 和 EID : 838-844 的绘制网格的都是同一个(意思那个带有 Mask
的 Image
组件会绘制两次)
第一次,是 Stencil Write 的部分:(如下图,只看绿色箭头的部分)
第二次,是 Stencil Clear 的部分:(如下图)
的枚举可以参考 MSDN 上的 DX11 文档又描述: D3D11_STENCIL_OP enumeration (d3d11.h) - 查找:D3D11_STENCIL_OP_ZERO 即可
所以,这就导致了在后续的 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 交互的效果了