Unity遮挡边缘光透明xray效果(Shader)

一. 前言

在3D游戏中,经常会出现控制的角色被房子或者墙壁之类的挡住,一些游戏会做一些特殊效果把角色被挡住的部分用xray边缘光显示出来,如下图,下面就用Shader实现遮挡透明效果。
在这里插入图片描述

二. 制作

1 创建Shader

shader需要两个pass来实现。其中一个pass正常显示贴图,另外一个pass实现xray效果。
创建一个Shader文件,Shader代码见文章末尾
在这里插入图片描述

2 创建材质球

创建材质球
在这里插入图片描述
使用刚刚的shader,设置RimColor
在这里插入图片描述
把材质球赋值给模型
在这里插入图片描述

3 测试

创建一个Cube遮挡角色,即可看到角色的边缘光透明xray效果
在这里插入图片描述


三. Shader代码

Shader "MyShader/RimShader"   
{
    Properties   
    { 
        _MainTex ("Base (RGB)", 2D) = "white" {}  
        _RimColor("RimColor",Color) = (0,1,1,1)
        _RimPower ("Rim Power", Range(0.1,8.0)) = 1.0
    }  
    SubShader   
    {
        LOD 300  
        Tags { "Queue" = "Geometry+500" "RenderType"="Opaque" } 
        Pass
        {
            Blend SrcAlpha One
            ZWrite off
            Lighting off
            ztest greater
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"
            float4 _RimColor;
            float _RimPower;
            struct appdata_t {
                float4 vertex : POSITION;
                float2 texcoord : TEXCOORD0;
                float4 color:COLOR;
                float4 normal:NORMAL;
            };
            struct v2f {
                float4  pos : SV_POSITION;
                float4  color:COLOR;
            } ;
            v2f vert (appdata_t v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                float3 viewDir = normalize(ObjSpaceViewDir(v.vertex));
                float rim = 1 - saturate(dot(viewDir,v.normal ));
                o.color = _RimColor*pow(rim,_RimPower);
                return o;
            }
            float4 frag (v2f i) : COLOR
            {
                return i.color; 
            }
            ENDCG
        }
        pass  
        {
            ZWrite on
            ZTest less 
            CGPROGRAM  
            #pragma vertex vert  
            #pragma fragment frag  
            sampler2D _MainTex;  
            float4 _MainTex_ST;
            struct appdata {
                float4 vertex : POSITION;  
                float2 texcoord : TEXCOORD0;  
            };  
            struct v2f  {
                float4 pos : POSITION;  
                float2 uv : TEXCOORD0;  
            };  
            v2f vert (appdata v) 
            {
                v2f o;  
                o.pos = UnityObjectToClipPos(v.vertex);  
                o.uv = v.texcoord;  
                return o;  
            } 
            float4 frag (v2f i) : COLOR  
            {
                float4 texCol = tex2D(_MainTex, i.uv);  
                return texCol;  
            }  
            ENDCG  
        }  
    } 
    FallBack "Diffuse" 
}  

猜你喜欢

转载自blog.csdn.net/linxinfa/article/details/105975216