平面漩涡Shader

最近进入了一家“养老”公司,公司节奏比之前慢了非常多,好处是心情比较轻松,做到哪算哪,但是没有高手在身边了,就没有什么学习的机会了,学习只有靠自觉了。

下面是一个平面漩涡效果:
在这里插入图片描述

其实说白了就是一个广告牌效果加上一个图片的矩阵旋转。网上随便找了一长渲染的图片:
在这里插入图片描述
然后参数是这样子的:
在这里插入图片描述

修改的部分有两处:

一个是对黑色背景的处理:

fixed4 c = tex2D (_MainTex, uv);
				//只取中间的部分
				float d =length(float2(uv.x-0.5,uv.y-0.5));
				if(d>0.5)clip(-1);
				//非线色部分透明
				c.a = c.rgb.r;
				c.r*=1.5;
				c.rgb = _Color.rgb*c.r;

二是对文理实时进行旋转:

float Rote = (-_Time.y*100 * 3.1415926)/180;
				float sinNum = sin(Rote);
				float cosNum = cos(Rote);

				float2 di = float2(_CenterX,_CenterY);
				float2 uv = mul(float3(i.uv - di,1),float3x3(1,0,0,0,1,0,_OffsetX,_OffsetY,1)).xy;
				uv = mul(uv,float2x2(cosNum,-sinNum,sinNum,cosNum))+di;

下面是完整代码:

Shader "Custom/GuangaopaiRota" {
	Properties {
		_MainTex ("Main Tex", 2D) = "white" {}
		_Color ("Color Tint", Color) = (1, 1, 1, 1)
		_VerticalBillboarding ("Vertical Restraints", Range(0, 1)) = 1 
		
		_CenterX("旋转中点x",Float) = 0.5
		_CenterY("旋转中点y",Float) = 0.5
		_OffsetX("平移x",float) = 0
		_OffsetY("平移y",float) = 0
	}
	SubShader {
		//这里主要是关闭批处理
		Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" "DisableBatching"="True"}
		
		Pass { 
			Tags { "LightMode"="ForwardBase" }
			
			ZWrite Off
			Blend SrcAlpha OneMinusSrcAlpha
			Cull Off
		
			CGPROGRAM
			
			#pragma vertex vert
			#pragma fragment frag
			
			#include "Lighting.cginc"
			
			sampler2D _MainTex;
			float4 _MainTex_ST;
			fixed4 _Color;
			fixed _VerticalBillboarding;

			float _CenterX;
			float _CenterY;
			float _OffsetX;
			float _OffsetY;
			
			struct a2v {
				float4 vertex : POSITION;
				float4 texcoord : TEXCOORD0;
			};
			
			struct v2f {
				float4 pos : SV_POSITION;
				float2 uv : TEXCOORD0;
			};
			
			v2f vert (a2v v) {
				v2f o;
				
				float3 center = float3(0, 0, 0);
				float3 viewer = mul(unity_WorldToObject,float4(_WorldSpaceCameraPos, 1));
				
				float3 normalDir = viewer - center;
				normalDir.y =normalDir.y * _VerticalBillboarding;
				normalDir = normalize(normalDir);
				float3 upDir = abs(normalDir.y) > 0.999 ? float3(0, 0, 1) : float3(0, 1, 0);
				float3 rightDir = normalize(cross(upDir, normalDir));
				upDir = normalize(cross(normalDir, rightDir));
				
				float3 centerOffs = v.vertex.xyz - center;
				float3 localPos = center + rightDir * centerOffs.x + upDir * centerOffs.y + normalDir * centerOffs.z;
              
				o.pos = UnityObjectToClipPos(float4(localPos, 1));
				o.uv = TRANSFORM_TEX(v.texcoord,_MainTex);

				return o;
			}
			
			fixed4 frag (v2f i) : SV_Target {
				//计算旋转部分
				float Rote = (-_Time.y*100 * 3.1415926)/180;
				float sinNum = sin(Rote);
				float cosNum = cos(Rote);

				float2 di = float2(_CenterX,_CenterY);
				float2 uv = mul(float3(i.uv - di,1),float3x3(1,0,0,0,1,0,_OffsetX,_OffsetY,1)).xy;
				uv = mul(uv,float2x2(cosNum,-sinNum,sinNum,cosNum))+di;//

				

				fixed4 c = tex2D (_MainTex, uv);
				//只取中间的部分
				float d =length(float2(uv.x-0.5,uv.y-0.5));
				if(d>0.5)clip(-1);
				//非线色部分透明
				c.a = c.rgb.r;
				c.r*=1.5;
				c.rgb = _Color.rgb*c.r;

				return c;
			}
			
			ENDCG
		}
	} 
	FallBack "Transparent/VertexLit"
}

猜你喜欢

转载自blog.csdn.net/ww1351646544/article/details/90083726