有没有RenderRoot2D遮挡3D粒子的解决方案?

image
如截图,有不少这类游戏,地表上有一些信息,角色上去可以累计资源这种玩法。我这边叫它地贴。
然而它使用传统的2D显示方案(就是加上RenderRoot2D),会非常方便,可以轻松的使用label,sprite,progressbar这类component的特性。为了解决3d物体踩上去的深度遮挡关系,建立材质使用builtin-sprite,勾选Depth Test就行了。但问题是,它挡不住上方出现的3d粒子。我试着修改3d粒子的材质,但始终无法解决。另外,3d粒子在空间中的深度关系和3d场景之间又是正常的。唯独3d粒子会被renderroot2d上的各种ui遮挡(粒子总是在后面)
我总觉得应该通过修改对应的builtin-sprite.effect或者它的材质来解决这个问题,但我一直没找到办法。
虽然比较着急的项目里面使用了另一个同步屏幕的更高优先级摄像机去解决。但毕竟还是希望最上层的粒子能在正确的空间中有正确的遮挡关系才是最好的。

我觉得应该还是两个透明层叠在一起,无法很好的控制渲染深度一样。
尝试粒子使用 3 - add-smooth,
尝试粒子使用 depth write,但是表现并不稳定。
也能遮挡下面的ui了。虽然粒子都成了一个个的小方块,如果能进一步找到alpha-test就好了
image

因为cocos的 RenderRoot2D组件 并不完善,问题如下:

RenderRoot2D下的UI渲染顺序都是 在 透明物体后面,大概顺序如下:
不透明物渲染–》透明物体渲染 --》 RenderRoot2D的UI
这样固定的顺序存在一个问题, RenderRoot2D 上的物体 永远会覆盖 透明物体之上,因为透明物体渲染不能写入深度

对比unity, RenderRoot2D组件应该提供两种模式,你需要的是 WorldSpace模式, 与透明物一起参与顺序排序渲染,而不是这样固定,我个人有改造渲染管线来实现,但改动较大就不分享了

开启hdr开启tonemaping,renderRoot2d下的sprite纹理颜色发生褪色,可能是由于2d纹理都ldr颜色空间的经过一次tonemapping后褪色了,大佬如果定制过渲染管线有没有思路怎么处理这个问题

虽然我没用过cocos的 tonemaping,但是一看你的渲染过程大概如下(你可以抓帧验证)

不透明物渲染–》透明物体渲染 --》 RenderRoot2D的UI --》后处理

要解决这个问题,2个不同的方案,你自己衡量改动成本:
1:把RenderRoot2D的渲染 移到 后处理 之后,改成这样:

不透明物渲染–》透明物体渲染–》后处理 --》 RenderRoot2D的UI
就可以解决了
2:不改顺序, RenderRoot2D的UI 的所有材质, 自己额外 手动加上 tonemapping的反向处理, 这样 一反一正 得到 正确效果

看起来第二种方案改动最小

第一种方案最后渲染和场景内3d物体就没有遮挡关系了,第二中tonemaping是后处理阶段改ui材质应该不会生效我可以验证一下!其实这两种方案我之前也问过ai

你说的第一种方案估计是深度被清理之后才画 RenderRoot2D的,才出问题。你应该这样尝试,RenderRoot2D的所有节点 额外用另外一个相机来渲染,前一个相机渲染场景其他节点,渲染后不清理深度,然后应用后处理, 这样估计就对了

第二种方案是 改RenderRoot2D下的 shader哦,应该是片元着色阶段 通过 后处理参数,反向处理,你问问AI吧

用两个相机那么renderroot2d下的ui就无法和3d物体穿插了,那就失去使用的意义了,第二种方案后处理应用应该在rootrender2d下的ui的shader之后

我今天有空用 3.8.7试了下, 确实如你所说无法穿插了。 但是我抓帧分析了下, 这个是 cocos的实现问题:
每个相机都是走独立渲染的管线,各自渲染到单独的纹理,然后把纹理叠加

这种粗暴做法性能差,而且导致了深度丢失,也是你说的 第二个 renderroot2d的ui无法和主相机的3d物体穿插了 , emm… 比unity真的差远了

unity 不同相机下的物体可以穿插吗,感觉也不行吧相机都不同这能做深度测试吗?tonemap的问题我再材质里做一次反向映射看起来差不多就凑合用了

不同相机但是用同一个RenderTarget,后续相机渲染时 选dont_clear就行。但是抓帧看了下运行和预期不符。 不纠结了

cocos做3D就是一堆问题,物理也是一堆坑

我今天有空用 3.8.7试了下, 确实如你所说无法穿插了。 但是我抓帧分析了下, 这个是 cocos的实现问题:
每个相机都是走独立渲染的管线,各自渲染到单独的纹理,然后把纹理叠加

这种粗暴做法性能差,而且导致了深度丢失,也是你说的 第二个 renderroot2d的ui无法和主相机的3d物体穿插了 , emm… 比某u真的差远了

一般这种是把ui单独渲染到rendertexture,然后再作为贴图给模型加入场景 :thinking:?唯一的问题就是空间内层级很多的时候很麻烦

深度测试没弄好?
RenderRoot2D 会自动合批,把每个批次使用的材质都开启深度测试试试。
对creator不熟,但原理都差不多

后面一个项目发现,把粒子上面挂自定义材质,priority调高,似乎可以显示在前面。懵逼了。