文章目录
一. 前言二. 制作1 创建Shader2 创建材质球3 测试 三. 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 OneZWrite offLighting offztest greaterCGPROGRAM#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 onZTest 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" }
如果觉得《Unity遮挡边缘光透明xray效果(Shader)》对你有帮助,请点赞、收藏,并留下你的观点哦!