美文网首页
Unity中,当目标物被其他物件遮挡时,用类似X-Ray的形式显

Unity中,当目标物被其他物件遮挡时,用类似X-Ray的形式显

作者: 全新的饭 | 来源:发表于2023-10-23 14:52 被阅读0次

说明

为目标物使用下面提供的shader(对应的Material)可实现期望效果。
XRay.shader

// Available at the Unity Asset Store - http://u3d.as/y3X 
Shader "Fan/XRay"
{
    Properties
    {
        _powVal("powVal", Int) = 2
        _MainTex("MainTex", 2D) = "white" {}
        _rimColor("rimColor", Color) = (0,0,0,0)
        _MainColor("MainColor", Color) = (0,0,0,0)
        _mulVal("mulVal", Int) = 1
        [HideInInspector] _texcoord( "", 2D ) = "white" {}

    }
    
    SubShader
    {
        
        
        Tags { "RenderType"="Opaque" }
    LOD 100

        CGINCLUDE
        #pragma target 3.0
        ENDCG
        Blend Off
        AlphaToMask Off
        Cull Back
        ColorMask RGBA
        ZWrite On
        ZTest LEqual
        Offset 0 , 0
        
        
        
        Pass
        {
            Name "UnlitPass1"
            ZTest Greater
            ZWrite Off
            Blend SrcAlpha OneMinusSrcAlpha

            CGPROGRAM

            

            #ifndef UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX
            //only defining to not throw compilation error over Unity 5.5
            #define UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input)
            #endif
            #pragma vertex vert
            #pragma fragment frag
            #pragma multi_compile_instancing
            #include "UnityCG.cginc"
            

            struct appdata
            {
                float4 vertex : POSITION;
                float4 color : COLOR;
                float3 ase_normal : NORMAL;
                UNITY_VERTEX_INPUT_INSTANCE_ID
            };
            
            struct v2f
            {
                float4 vertex : SV_POSITION;
                #ifdef ASE_NEEDS_FRAG_WORLD_POSITION
                float3 worldPos : TEXCOORD0;
                #endif
                float4 ase_texcoord1 : TEXCOORD1;
                UNITY_VERTEX_INPUT_INSTANCE_ID
                UNITY_VERTEX_OUTPUT_STEREO
            };

            uniform float4 _rimColor;
            uniform int _powVal;
            uniform int _mulVal;

            
            v2f vert ( appdata v )
            {
                v2f o;
                UNITY_SETUP_INSTANCE_ID(v);
                UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
                UNITY_TRANSFER_INSTANCE_ID(v, o);

                float3 ase_worldNormal = UnityObjectToWorldNormal(v.ase_normal);
                o.ase_texcoord1.xyz = ase_worldNormal;
                
                
                //setting value to unused interpolator channels and avoid initialization warnings
                o.ase_texcoord1.w = 0;
                float3 vertexValue = float3(0, 0, 0);
                #if ASE_ABSOLUTE_VERTEX_POS
                vertexValue = v.vertex.xyz;
                #endif
                vertexValue = vertexValue;
                #if ASE_ABSOLUTE_VERTEX_POS
                v.vertex.xyz = vertexValue;
                #else
                v.vertex.xyz += vertexValue;
                #endif
                o.vertex = UnityObjectToClipPos(v.vertex);

                #ifdef ASE_NEEDS_FRAG_WORLD_POSITION
                o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
                #endif
                return o;
            }
            
            fixed4 frag (v2f i ) : SV_Target
            {
                UNITY_SETUP_INSTANCE_ID(i);
                UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
                fixed4 finalColor;
                #ifdef ASE_NEEDS_FRAG_WORLD_POSITION
                float3 WorldPosition = i.worldPos;
                #endif
                float3 ase_worldNormal = i.ase_texcoord1.xyz;
                float3 worldSpaceViewDir3 = WorldSpaceViewDir( float4( 0,0,0,1 ) );
                float3 normalizeResult4 = normalize( worldSpaceViewDir3 );
                float dotResult5 = dot( ase_worldNormal , normalizeResult4 );
                
                
                finalColor = ( _rimColor * ( pow( ( 1.0 - dotResult5 ) , (float)_powVal ) * _mulVal ) );
                return finalColor;
            }
            ENDCG
        }
        
        
        Pass
        {
            Name "UnlitPass2"
            ZTest LEqual
            ZWrite On
            Blend Off

            CGPROGRAM

            

            #ifndef UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX
            //only defining to not throw compilation error over Unity 5.5
            #define UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input)
            #endif
            #pragma vertex vert
            #pragma fragment frag
            #pragma multi_compile_instancing
            #include "UnityCG.cginc"
            #include "Lighting.cginc"
            #include "AutoLight.cginc"
            #define ASE_NEEDS_FRAG_WORLD_POSITION


            struct appdata
            {
                float4 vertex : POSITION;
                float4 color : COLOR;
                float4 ase_texcoord : TEXCOORD0;
                float3 ase_normal : NORMAL;
                UNITY_VERTEX_INPUT_INSTANCE_ID
            };
            
            struct v2f
            {
                float4 vertex : SV_POSITION;
                #ifdef ASE_NEEDS_FRAG_WORLD_POSITION
                float3 worldPos : TEXCOORD0;
                #endif
                float4 ase_texcoord1 : TEXCOORD1;
                float4 ase_texcoord2 : TEXCOORD2;
                UNITY_VERTEX_INPUT_INSTANCE_ID
                UNITY_VERTEX_OUTPUT_STEREO
            };

            //This is a late directive
            
            uniform sampler2D _MainTex;
            uniform float4 _MainTex_ST;
            uniform float4 _MainColor;

            
            v2f vert ( appdata v )
            {
                v2f o;
                UNITY_SETUP_INSTANCE_ID(v);
                UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
                UNITY_TRANSFER_INSTANCE_ID(v, o);

                float3 ase_worldNormal = UnityObjectToWorldNormal(v.ase_normal);
                o.ase_texcoord2.xyz = ase_worldNormal;
                
                o.ase_texcoord1.xy = v.ase_texcoord.xy;
                
                //setting value to unused interpolator channels and avoid initialization warnings
                o.ase_texcoord1.zw = 0;
                o.ase_texcoord2.w = 0;
                float3 vertexValue = float3(0, 0, 0);
                #if ASE_ABSOLUTE_VERTEX_POS
                vertexValue = v.vertex.xyz;
                #endif
                vertexValue = vertexValue;
                #if ASE_ABSOLUTE_VERTEX_POS
                v.vertex.xyz = vertexValue;
                #else
                v.vertex.xyz += vertexValue;
                #endif
                o.vertex = UnityObjectToClipPos(v.vertex);

                #ifdef ASE_NEEDS_FRAG_WORLD_POSITION
                o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
                #endif
                return o;
            }
            
            fixed4 frag (v2f i ) : SV_Target
            {
                UNITY_SETUP_INSTANCE_ID(i);
                UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
                fixed4 finalColor;
                #ifdef ASE_NEEDS_FRAG_WORLD_POSITION
                float3 WorldPosition = i.worldPos;
                #endif
                float2 uv_MainTex = i.ase_texcoord1.xy * _MainTex_ST.xy + _MainTex_ST.zw;
                float3 ase_worldNormal = i.ase_texcoord2.xyz;
                float3 worldSpaceLightDir = UnityWorldSpaceLightDir(WorldPosition);
                float dotResult17 = dot( ase_worldNormal , worldSpaceLightDir );
                
                finalColor = ( tex2D( _MainTex, uv_MainTex ) * _MainColor * ( ( dotResult17 * 0.5 ) + 0.5 ) );
                return finalColor;
            }
            ENDCG
        }
        
    }
    Fallback Off
}

相关文章

网友评论

      本文标题:Unity中,当目标物被其他物件遮挡时,用类似X-Ray的形式显

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