shader简单的mesh光束效果

效果不是如下 比图中要真实清晰==
在这里插入图片描述

Shader "Unlit/LightBean_Code"
{
    
    
	Properties
	{
    
    

		_MainTex ("Texture", 2D) = "white" {
    
    }
		_EmissColor("_EmissColor",color) = (1,1,1,1)
		_EmissIntensity("_EmissIntensity",float) = 0.75
		_FadeOffset("_FadeOffset",float) = 0
		_FadePower("_FadePower",Range(0,10)) = 5
		_RimMin("_RimMin",Range(-1,0.9)) = 0.8
		_RimMax("_RimMax",Range(-2,5)) = 0.9
		_Expand("_Expand",float) = 0
		_Speed("_Speed",vector) = (0.1,0,0,0)
	}
	SubShader
	{
    
    
		Tags {
    
     "RenderType"="Transparent" }
		LOD 100

		Pass
		{
    
    
			ZWrite off
			Blend SrcAlpha OneMinusSrcAlpha
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			
			#include "UnityCG.cginc"

			struct appdata
			{
    
    
				float4 vertex : POSITION;
				float2 uv : TEXCOORD0;
				float3 normal : NORMAL;
			};

			struct v2f
			{
    
    
				float2 uv : TEXCOORD0;
				float4 vertex : SV_POSITION;
				float3 worldPos : TEXCOORD1;
				float3 worldNormal : TEXCOORD2;
				float2 vertexUV : TEXCOORD3;
			};

			sampler2D _MainTex;
			float4 _MainTex_ST;
			
			float _FadePower;
			float _FadeOffset;
			float _RimMax,_RimMin,_Expand,_EmissIntensity;
			float4 _EmissColor,_Speed;

			v2f vert (appdata v)
			{
    
    
				v2f o;
				// 用 uv的 x  限制一下,x=0 的根部就会不缩放。。 从而防止整体缩放 
				v.vertex.xyz = v.vertex.xyz +  v.normal * _Expand  * v.uv.x;				
				o.vertex = UnityObjectToClipPos(v.vertex);
				// 下面在用 uv.x  参与计算的  都是未经缩放的uv值,此处单独标记一下
				o.vertexUV = v.uv;
				o.uv  = TRANSFORM_TEX(v.uv, _MainTex);
				float3 worldPos = mul(unity_ObjectToWorld,v.vertex);
				o.worldPos = worldPos;
				o.worldNormal =	UnityObjectToWorldNormal(v.normal);
				return o;
			}
			
			fixed4 frag (v2f i) : SV_Target
			{
    
    
				
				float2 uv = i.vertexUV;
				// 控制光束的大小
				float fadeData = saturate(((1 - uv.x ) - _FadeOffset )* _FadePower);
				fadeData = min(fadeData,1.0 - uv.x);


				float3 worldPos = i.worldPos;
				float3 viewDir = normalize(UnityWorldSpaceViewDir(worldPos)) ;
				float3 normal = normalize(i.worldNormal);
				//  控制高亮的范围
				float nDv = abs(dot(viewDir,normal));
				float fresnal = smoothstep(_RimMin,_RimMax,nDv);
				// 两者相乘 作为透明度
				float alpha = fadeData * fresnal;

				// 顶点动画
				float2 uv_main = i.uv + _Speed.xy * _Time.y * 1.0;
				fixed4 col = tex2D(_MainTex, uv_main);
 				float4 endCol = col.r * _EmissColor * _EmissIntensity;

				return float4(endCol.rgb,alpha);
			}
			ENDCG
		}
	}
}

猜你喜欢

转载自blog.csdn.net/js0907/article/details/118711858