1. 程式人生 > >【Shader】人物在牆一側透視效果

【Shader】人物在牆一側透視效果

// 當物體被遮擋之後,會在牆的一側顯示輪廓的透視效果
Shader "Custom/SeeThroughWall"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        // 透過牆看到的物體的輪廓高亮顏色
        _EdgeColor("Edge Color", Color) = (1,1,1,1)
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }

        // 顯示輪廓高亮
        Pass
        {
            // 深度測試的時候如果深度比其他物體大(被遮擋)
// 渲染高亮輪廓 ZTest Greater Blend One One CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; //@add
float3 normal : NORMAL; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; //@add float3 normal : NORMAL; float3 viewDir : TEXCOORD1; }; sampler2D _MainTex; float4 _MainTex_ST; float4 _EdgeColor; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = TRANSFORM_TEX(v.uv, _MainTex); //@add
o.normal = UnityObjectToWorldNormal(v.normal); o.viewDir = normalize(_WorldSpaceCameraPos.xyz - mul(unity_ObjectToWorld, v.vertex).xyz); return o; } fixed4 frag (v2f i) : SV_Target { float NdotV = 1 - dot(i.normal, i.viewDir) * 1.5; return _EdgeColor * NdotV; } ENDCG } // 繪製物體 Pass { ZTest Less CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; UNITY_FOG_COORDS(1) float4 vertex : SV_POSITION; }; sampler2D _MainTex; float4 _MainTex_ST; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = TRANSFORM_TEX(v.uv, _MainTex); UNITY_TRANSFER_FOG(o,o.vertex); return o; } fixed4 frag (v2f i) : SV_Target { fixed4 col = tex2D(_MainTex, i.uv); return col; } ENDCG } } }