美文网首页
Unity Shader深度测试-透视xray(转)

Unity Shader深度测试-透视xray(转)

作者: 雄关漫道从头越 | 来源:发表于2019-06-23 03:11 被阅读0次

    Unity Shader深度测试-透视xray

    透视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
            }
        }
    }
    

    相关文章

      网友评论

          本文标题:Unity Shader深度测试-透视xray(转)

          本文链接:https://www.haomeiwen.com/subject/gkgbqctx.html