Unity Shader深度测试-透视xray

发表于2018-06-21
评论2 4.5k浏览
透视XRay效果常常用来显示被墙体及其它物体遮挡的物体的轮廓,下面就和大家介绍下透视xray的使用。

效果

思路

实现这个效果需要两个pass
1. 绘制被遮挡部分,即 深度测试 Greater ,且不写入 深度缓冲区(防止印象其他物体的深度对比),剩下的 xray效果就比较容易,同一 空间 下通过 点积 处理。
2. 正常绘制,即 深度测试 LEqual ,且写入 深度缓冲区(正常与其他物体遮挡)。

shader代码:
Shader "ITS/test/aaaa_XRay"
{
    Properties
    {
        _MainTex("Base 2D", 2D) = "white" {}
        _XRayColor("XRay Color", Color) = (1,1,1,1)
    }
    SubShader
    {
        CGINCLUDE // 写法二,使用 CGINCLUDE 写好 顶点、片段 着色器,然后各个 Pass 中 使用 CGPROGRAM 指定需要用到的 顶点、片段 着色器
        #include "UnityCG.cginc"
        fixed4 _XRayColor;
        struct v2f
        {
            float4 pos : SV_POSITION;
            float3 normal : NORMAL;
            float3 viewDir : TEXCOORD0;
            fixed4 clr : COLOR;
        };
        v2f vertXray(appdata_base v)
        {
            v2f o;
            o.pos = UnityObjectToClipPos(v.vertex);
            o.viewDir = ObjSpaceViewDir(v.vertex); // 在 模型空间 上计算夹角
            o.normal = v.normal;
            float3 normal = normalize(v.normal);
            float3 viewDir = normalize(o.viewDir);
            float rim = 1 - dot(normal, viewDir);
            o.clr = _XRayColor * rim;
            return o;
        }
        fixed4 fragXray(v2f i) : SV_TARGET
        {
            return i.clr;
        }
        sampler2D _MainTex;
        float4 _MainTex_ST;
        struct v2f2 
        {
            float4 pos : SV_POSITION;
            float2 uv : TEXCOORD0;
        };
        v2f2 vertNormal(appdata_base v)
        {
            v2f2 o;
            o.pos = UnityObjectToClipPos(v.vertex);
            o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
            return o;
        }
        fixed4 fragNormal(v2f2 i) : SV_TARGET
        {
            return tex2D(_MainTex, i.uv);
        }
        ENDCG
        Pass // xRay 绘制
        {
            Tags{ "RenderType"="Transparent" "Queue"="Transparent"}
            Blend SrcAlpha One
            ZTest Greater
            ZWrite Off
            Cull Back
            CGPROGRAM
            #pragma vertex vertXray
            #pragma fragment fragXray
            ENDCG
        }
        Pass // 正常绘制
        {
            Tags{ "RenderType"="Opaque" }
            ZTest LEqual
            ZWrite On
            CGPROGRAM
            #pragma vertex vertNormal
            #pragma fragment fragNormal
            ENDCG
        }
    }
}

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引