边缘发光效果的两种写法

我们可以看到很多游戏经常会有这种模型边缘发光的效果,看起来很高大上的样子。其实实现起来挺简单的,网上也有很多这样的例子分享,现在我也来分享一下两种Shader实现的代码吧。

1.Surface Shader

[html]  view plain copy
  1. Shader "Custom/Rim Light" {  
  2.        Properties {  
  3.               _MainTex("Base (RGB)", 2D) = "white" {}  
  4.               _RimColor("_RimColor", Color) =(0.17,0.36,0.81,0.0)  
  5.               _RimWidth("_RimWidth", Range(0.6,9.0)) = 0.9  
  6.        }  
  7.    
  8.        SubShader {  
  9.               Tags{ "RenderType" = "Opaque"}  
  10.               LOD 150  
  11.   
  12.               CGPROGRAM  
  13.    
  14.               #pragma surface surf Lambert  
  15.                
  16.               struct Input {  
  17.                      float2 uv_MainTex;  
  18.                      float3 viewDir;  
  19.               };  
  20.    
  21.               sampler2D _MainTex;  
  22.               fixed4 _RimColor;  
  23.               fixed _RimWidth;  
  24.    
  25.               void surf (Input IN, inout SurfaceOutput o) {  
  26.                      fixed4 t = tex2D (_MainTex, IN.uv_MainTex);  
  27.                      o.Albedo = t.rgb;  
  28.                      o.Alpha = t.a;  
  29.                      half rim = 1.0 - saturate(dot (normalize(IN.viewDir), o.Normal));  
  30.                      o.Emission_RimColor.rgb * pow (rim, _RimWidth);  
  31.               }  
  32.   
  33.               ENDCG  
  34.        }  
  35.    
  36.        Fallback "Diffuse"  
  37. }  
主要是这两句起到关键作用。
[html]  view plain copy
  1. half rim = 1.0 - saturate(dot (normalize(IN.viewDir), o.Normal));  
  2. o.Emission_RimColor.rgb * pow (rim, _RimWidth);  
如果不想受灯光影响,可以在Tags加上"LightMode"="Always"

2.Vetex and Fragment Shader

[html]  view plain copy
  1. Shader "Custom/Rim Light VF" {  
  2.     Properties {  
  3.         _MainTex ("Base (RGB)", 2D) = "white" {}  
  4.         _Color ("Main Color", Color) = (1,1,1,1)  
  5.         _RimColor ("Rim Color", Color) = (1, 1, 1, 1)  
  6.         _RimWidth ("Rim Width", float) = 0.9  
  7.     }  
  8.     SubShader {  
  9.         Pass {  
  10.             Lighting Off  
  11.             CGPROGRAM  
  12.                 #pragma vertex vert  
  13.                 #pragma fragment frag  
  14.                 #include "UnityCG.cginc"  
  15.   
  16.                 struct appdata   
  17.                 {  
  18.                     float4 vertex : POSITION;  
  19.                     float3 normal : NORMAL;  
  20.                     float2 texcoord : TEXCOORD0;  
  21.                 };  
  22.   
  23.                 struct v2f   
  24.                 {  
  25.                     float4 pos : SV_POSITION;  
  26.                     float2 uv : TEXCOORD0;  
  27.                     fixed3 color : COLOR;  
  28.                 };  
  29.   
  30.                 uniform float4 _MainTex_ST;  
  31.                 uniform fixed4 _RimColor;  
  32.                 float _RimWidth;  
  33.   
  34.                 v2f vert (appdata_base v) {  
  35.                     v2f o;  
  36.                     o.pos = mul (UNITY_MATRIX_MVP, v.vertex);  
  37.   
  38.                     float3 viewDir = normalize(ObjSpaceViewDir(v.vertex));  
  39.                     float dotProduct = 1 - dot(v.normal, viewDir);  
  40.                      
  41.                     o.color = smoothstep(1 - _RimWidth, 1.0, dotProduct);  
  42.                     o.color *= _RimColor;  
  43.   
  44.                     o.uv = v.texcoord.xy;  
  45.                     return o;  
  46.                 }  
  47.   
  48.                 uniform sampler2D _MainTex;  
  49.                 uniform fixed4 _Color;  
  50.   
  51.                 fixed4 frag(v2f i) : COLOR {  
  52.                     fixed4 texcol = tex2D(_MainTex, i.uv);  
  53.                     texcol *= _Color;  
  54.                     texcol.rgb += i.color;  
  55.                     return texcol;  
  56.                 }  
  57.             ENDCG  
  58.         }  
  59.     }  
  60. }  

当然最关键的还是vert方法里的代码,具体两种方法大家可以根据需求使用。看看效果,赶紧试试吧。

边缘发光效果的两种写法_第1张图片

你可能感兴趣的:(Unity3D)