效果图
![](https://img-blog.csdnimg.cn/img_convert/e8092b7f4e7193a43b2bb173d19f2e43.gif)
现实原理
遮挡关系处理实现:通过两个Pass以及深度测试实现
边缘光效果,检测视线方向与法线方向夹角来实现。
渲染X光效果的Pass使用ZTest Greater,在渲染的时候,有遮挡的部分之前的遮挡物的深度,而未遮挡的部分由于深度无穷大深度测试不会通过,不显示任何内容,而被遮挡的部分,深度是遮挡物的深度,人物在遮挡物后,深度大于遮挡物,深度测试通过,会将遮挡部分渲染成Pass的输出, 而且这个Pass不能写入深度,因为我们还需要正常画出人物未被遮挡的部分,此时就可以正常的深度测试ZTest LEqual,被遮挡的部分不渲染,只渲染未被遮挡的部分。
也就是第一pass渲染出被遮挡的部分,第二pass 正常渲染未被遮挡的部分。
遮挡部分shader核心代码
fixed4 frag(v2f i) : COLOR0
{
float3 normal = normalize(i.normal);
float3 viewDir = normalize(i.viewDir);
//视线方向V与法线方向N垂直时,这个法线对应的面就与视线方向平行,
//说明当前这个点对于当前视角来说,就处在边缘;
float rim = 1 - dot(normal, viewDir);
//增加了一点噪声效果
half3 noise = tex2D(_NoiseTex, i.zw );
// return lerp(_XRayColor * rim, fixed4(noise.rgb, 0.2), _Density);
return _XRayColor * rim;
}