透明渲染方式下的渲染顺序问题

 

项目中的角色的眉毛处是可以替换的,所以美术会把角色的模型处做上睫毛的顶点。

这样是为了方便表现睫毛的形状。然后用替换睫毛贴图到角色身上来做成睫毛的更换,并且睫毛在没内容的地方做透明处理就能显示处正常的睫毛。

但是如果我们直接替换睫毛上去其实并不能看到正确的效果,因为睫毛是身体一部分,然后身体上的睫毛这部分是透明的,所以看到的是透明的效果

所以我们需要修改下身体的shader。

 

在输出颜色前设置他的透明度。这里解释下,如果是身体本身贴图是透明的并且睫毛的透明度大于0说明这里要显示睫毛,则设置为睫毛的透明度。其他就不需要解释了。

得到的效果如下:

ok,看上去已经成功了。

但是跑起来并且装扮上头发之后得到的效果是(前提说明,头发的shader和身体的shader是两个shader,并且两个shader都是用的不透明渲染方式)

 

这里我思考了一段时间为什么得到这个效果。因为我们用到的管线是lwrp的,然后从管线代码看,其实没有任何问题,都是正常的渲染每个相机对他做前向渲染

然后看shader中是否是blend导致的效果,然后发现其实也不是,角色的身体先混合,所以没有这个问题。

 

然后换衣是不是AlphaDiscard影响的,隐藏了也没用,因为AlphaDiscard也是对自身的透明度处理,并不会夸drawcall处理

 

后来发现了一个问题,就是渲染顺序,前面也说了,我们用的是不透明渲染方式。

不透明渲染方式有个特点就是越靠近相机越先渲染(当然可以控制渲染顺序),然后前面渲染的像素在后面渲染的内容上是不进行渲染的(也就是如果前面在像素a有像素的,这个像素看上去无论透不透明,后面渲染的物体都不能在这个像素上有内容了)。

 

然后我看了下framedebbug发现

 

头发是在身体后渲染的。然后又根据我们前面表粗体字的论点,可以得知身体上就算是透明的也不会在头发shader上渲染。所以我们可以看到他的睫毛透明处透到背景的效果

知道原因解决办法就有了:

解决办法1:可以用透明度渲染来解决,天生没这个问题

解决办法2:调换两个shader的顺序,因为他们都有深度测试,所以还是会正常显示先后。

 

最终我选择的是方法2,然后就得到了正常的渲染效果了

总结:

1.如果睫毛先渲染,因为是深度写入,所以睫毛先写入了深度中,然后头发再渲染,头发在睫毛这块区域比睫毛深度低,我们正常渲染是ZTest为大于等于的,所以头发的颜色不能写入。所以出现了显示不出睫毛部分的颜色的问题。

2.如果头发先渲染,因为深度写入,所以头发的颜色写入深度中,然后睫毛渲染,又因为我们是透明渲染顺序("Queue" = "Transparent")所以睫毛会叠加再头发上面,所以头发和睫毛都能正常显示。

 

在使用URP(Universal Render Pipeline)时,如果将Lit Shader设置为Transparent,意味着你希望该材质渲染为半透明效果。在这种情况下,渲染顺序变得非常重要,因为它会影响到对象的视觉叠加效果。 在Unity中,半透明物体通常是按照从后到前(由远离摄像机到接近摄像机)的顺序进行渲染的,以确保正确的透明度混合。然而,URP默认的渲染顺序可能并不总是符合特定场景的需求。以下是一些解决URP/Lit Shader设置为Transparent时渲染顺序问题的方法: 1. **使用渲染队列**: - 在Shader文件中,可以通过`Tags`来设置渲染队列。例如,你可以将队列设置为`Transparent`来确保它在不透明物体之后绘制。 ```csharp Tags { "Queue" = "Transparent" } ``` - 这样做可以确保透明物体在大多数不透明物体渲染完毕后再渲染,但不保证它们之间的相对顺序。 2. **使用渲染排序层(Render Layers)**: - 如果需要更细粒度的控制,你可以使用Unity的渲染排序层功能。在需要控制的物体上设置一个特定的Layer,并在相机的渲染设置中为这些Layer指定特定的渲染顺序。 3. **使用相机排序设置(CameraSortingLayer)**: - 通过为相机设置一个排序层,你可以控制相机渲染特定Layer上的物体的顺序。这样,你可以优先渲染某些半透明物体。 4. **自定义渲染顺序**: - 如果以上方法仍不能满足需求,可以通过编写自定义的渲染逻辑来强制特定的渲染顺序。这可能需要使用到Unity的事件回调,如`OnRenderObject`,在这些回调中你可以手动指定哪些物体先渲染。 需要注意的是,URP通常会根据渲染队列自动对材质进行排序,但有时候一些特殊的Shader或者使用了特殊技术(如实例化、遮挡剔除等)的场景可能需要额外处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值