3D AlphaBlend问题

版本:3.4.2
我有两个模型,都开了transparent模式,并且都开了深度写入。
但游戏显示效果,下面的模型会被上面模型的透明部分遮挡掉。而编辑器显示效果正确。
image
image

方便给个 demo 看看?215194780@qq.com

您好,请问问题是否已经解决?如果您长时间未确认问题是否解决,我们将默认视问题已解决。

没有解决哦!但我没有时间提取demo。目前的解决方法是一个透明物体一个相机来渲染。

好的,我们会再跟进看看。。

正常来说用了transparent的模型不应该再开启深度写入,只需要开启深度检测即可,否则就会出现上述问题,前面的像素深度值更低因此丢弃了后面的像素

哇,放空小姐姐。不管是不是开深度检测都有这个问题,我刚在提demo的时候发现,好像跟相机角度有点关系,我弄了另一个测试样例。
一个Add模型的面片在上面,一个transparent或者是opaque在下面。编辑器显示也是有问题
image
image
麻烦可以给个邮箱地址发一个demo吗。

是项目特定的资源(有版权风险)吗,不是可以直接在帖子里传一份 demo

你好,能帮我看下这个帖子吗?命令行构建packages怎么配置

使用了项目资源,麻烦给个邮箱吧。

350791117@qq.com 发这个

已经发送,辛苦看一下。

你的测试例给的是一个 jpg,是不带透明通道的,用这个来做混合现在的现象看起来没什么问题,我后面换 CD1 这个资源来做测试了。针对透明物体的排序通常有两种

  1. 透明物体之间不要放的太近,否则会因为深度检测精度不够导致相机照射不同角度检测到的深度是不一样的,就会出现乱序的现象,所以针对如果想要用深度来检测的物体,他们之间的深度一定是有明确差异的
  2. 针对第1点,即使我们把不同物体的深度拜访很明确,但是如果相机是一个可操控相机,往往还是会因为不同的角度导致的深度检测不可控,这个时候我们可以通过手动控制排序的方式来明确渲染顺序,详细可设置材质身上的 pipelineState 的 priority 属性控制排序

辛苦了,我明天试一下。
我给的测试jpg是使用add模式跟不透明物体的,这个在我的项目中也是有问题的,而我给的测试项目,在我的电脑上也是有问题,但是,如果坐一些操作,比如改一下相机位置或者换个材质什么的,顺序又好了。

还是要感谢你提醒了我,深度测试值的实际范围是0-1,按这个理论,我明天把项目的主相机的far值改小,应该就可以避免透明物体太过靠近问题。
不过如果是因为深度值精度问题,那不透明物体是不是应该也会同样有这个问题,但我平时开发,很少遇到,除非两个面片互相靠近,但离相机很远,就会出现闪烁。而这个半透明却是离相机10米远就深度计算不对了。这其中有什么不同,请教一下。

放空早上好,我今天早上做了两个尝试操作,目标两个物体,一个是transparent,一个是add,这两个物理的Y间隔为0.3
第一个尝试是把相机far改为100,显示效果还是不对。
二是修改pipelineState 的 priority为64或者是256,也是没有效果,在编辑器中显示都是错误的。
我把项目中的CDprefab导出来再发你邮箱,麻烦再帮忙看一下。

1赞

这个问题需要回到深度测试和混合测试章节。针对不透明的物体,shader 会直接开启深度测试,由 gpu 根据片元深度进行片元替换。

针对(半)透明物体,又不能像深度测试一样丢弃片元(一般情况下不开启深度写入),不然就会出现半透明物体后面的物体片元被丢弃。因此需要进行混合,混合通常是从后往前绘制,这样能保证混合的正确性,但是如何保证从后往前渲染呢,这时候我们就要提前进行一次深度排序,来确定透明物体的绘制顺序,引擎内会根据物体节点距离相机深度来处理,所以这时候也就会出现相机的不同角度,两个透明物体绘制先后的问题

我看了一下,目前因为引擎针对不透明物体启用 use intancing 不会进行排序,所以也会导致一些问题,暂时先把 instancing 关了吧

感谢回复,关了instancing在编辑器中看起来是不正确,但运行时正确了。

该主题在最后一个回复创建后14天后自动关闭。不再允许新的回复。