您当前的位置: 首页 >  unity

Jave.Lin

暂无认证

  • 5浏览

    0关注

    704博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

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

Jave.Lin 发布时间:2021-07-08 18:06:21 ,浏览量:5

文章目录
  • 问题
  • 解决方法

问题

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

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

Image 材质 在这里插入图片描述

ParticleSystem 的材质 在这里插入图片描述

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

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

在这里插入图片描述

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

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

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

抱着怀疑的心态,我使用了 RenderDoc 来查看了绘制过程,显示找到了 绘制的 EventID 在这里插入图片描述

每个 Event ID 对象的绘制 在这里插入图片描述

发现其中的猫腻: 在这里插入图片描述

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

第一次,是 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 交互的效果了

关注
打赏
1664331872
查看更多评论
立即登录/注册

微信扫码登录

0.2028s