Unity Shader 被遮挡部分半透高亮显示

效果图

现实原理

遮挡关系处理实现:通过两个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;  
} 

示例下载

猜你喜欢

转载自blog.csdn.net/st75033562/article/details/129441652