在3D游戏中,地图上的各种物件会对模型照成遮挡。主要是在主角上 体验很不好。让被遮挡的部分有个透明边框显示出来,是个比较好的解决方案。
思路:要分成两个PASS来做,1个就是画出透明边框,另一个是正常的显示纹理。透明边框的PASS需要把在被遮挡时显示,这里需要对深度测试和深度写入做操作。当没被遮挡到时则正常显示模型。
上节做完边缘泛光刚好可以用上,稍微改造下就可以被边缘显示出来。
看图:

成品效果:

ZTest 默认是LEqual的 则是相对于摄像机在越靠前的物体优先渲染。则后面的物体会被前面的物体遮挡。而我们需要相反,半透明边框是要在被遮挡住的时候才被渲染,所以使用了Greater。
ZWrite 默认是 On 则默认做深度的写入,这里同理也要关掉。
代码:
Shader "JackyShader/maskShader"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_maskColor("MaskColor",Color) = (0,1,0)
}
SubShader
{
Tags { "RenderType"="Transparent" "Queue" = "Transparent+1" }
LOD 100
Pass
{
Blend SrcAlpha OneMinusSrcAlpha
//深度大于于 深度最大值时,渲染物体
ZTest Greater
//关闭深度写入 就是为了不被靠前的物体遮挡到
ZWrite Off
CGPROGRAM
#prag

本文介绍了如何在Unity中解决3D模型被遮挡时的用户体验问题,通过创建两个PASS来实现透明边框效果。第一个PASS用于绘制透明边框,当模型被遮挡时显示;第二个PASS进行正常纹理渲染。关键在于调整深度测试和深度写入,使用Greater ZTest确保被遮挡部分渲染,并关闭ZWrite避免深度写入。最后展示了实现后的效果。
最低0.47元/天 解锁文章
2518

被折叠的 条评论
为什么被折叠?



