最近进入了一家“养老”公司,公司节奏比之前慢了非常多,好处是心情比较轻松,做到哪算哪,但是没有高手在身边了,就没有什么学习的机会了,学习只有靠自觉了。
下面是一个平面漩涡效果:
其实说白了就是一个广告牌效果加上一个图片的矩阵旋转。网上随便找了一长渲染的图片:
然后参数是这样子的:
修改的部分有两处:
一个是对黑色背景的处理:
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"
}