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

一. 前言
在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" 
}  

————————————————
版权声明:本文为CSDN博主「林新发」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/linxinfa/article/details/105975216

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值