透明渲染方式下的渲染顺序问题
项目中的角色的眉毛处是可以替换的,所以美术会把角色的模型处做上睫毛的顶点。
这样是为了方便表现睫毛的形状。然后用替换睫毛贴图到角色身上来做成睫毛的更换,并且睫毛在没内容的地方做透明处理就能显示处正常的睫毛。
但是如果我们直接替换睫毛上去其实并不能看到正确的效果,因为睫毛是身体一部分,然后身体上的睫毛这部分是透明的,所以看到的是透明的效果
所以我们需要修改下身体的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")所以睫毛会叠加再头发上面,所以头发和睫毛都能正常显示。