原理:采样一张纹理贴图,并让这张纹理随着时间做变化即有流动效果。
为了让采样的纹理能从上往下依次进行扫描,需要从原始零点采样流光纹理。
float3 pos_world = mul(unity_ObjectToWorld, v.vertex).xyz;
o.pos_world = pos_world;
o.pivot_world = mul(unity_ObjectToWorld, float4(0.0, 0.0, 0.0, 1.0)).xyz;//相对于原点
o.normal = v.normal;
uv数值:
half2 uv_flow = (i.pos_world.xy - i.pivot_world.xy) * _FlowTilling.xy;
uv_flow = uv_flow + _Time.y * _FlowSpeed.xy;
采样:
float4 flow_rgba = tex2D(_FlowTex, uv_flow) * _FlowIntensity;
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
Shader "MyLearn01/LiuGuangHeadShader"
{
Properties
{
_MainTex("Texture", 2D) = "" {}
_FlowTex("Flow Tex 流光纹理",2D) = "white"{}
_FlowTilling("Flow Tilling 流光纹理缩放偏移",Vector) = (1,1,0,0)
_FlowSpeed("Flow Speed 流光速度",Vector) = (1,1,0,0)
_FlowIntensity("Flow Intensity 流光强度",Float) = 0.5
}
SubShader
{
//Tags { "RenderType" = "Transparent" }
Tags { "RenderType" = "Opaque" }
LOD 100
Pass
{
//ZWrite Off
//Blend SrcAlpha One
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata //CPU向顶点Shader提供的模型数据
{
//冒号后面的是特定语义词,告诉CPU需要哪些类似的数据
float4 vertex : POSITION; //模型空间顶点坐标
half2 texcoord0 : TEXCOORD0; //第一套UV
half4 color : COLOR; //顶点颜色
half3 normal : NORMAL; //顶点法线
half4 tangent : TANGENT; //顶点切线(模型导入Unity后自动计算得到)
};
struct v2f //自定义数据结构体,顶点着色器输出的数据,也是片元着色器输入数据
{
float4 pos : SV_POSITION; //输出裁剪空间下的顶点坐标数据,给光栅化使用,必须要写的数据
float2 uv : TEXCOORD0; //自定义数据体
float3 normal : TEXCOORD1;
float3 pos_world : TEXCOORD2;
float3 pivot_world : TEXCOORD3;
};
sampler2D _MainTex;
float4 _MainTex_ST;
float4 _FlowTilling;
float4 _FlowSpeed;
sampler2D _FlowTex;
float _FlowIntensity;
//顶点Shader
v2f vert(appdata v)
{
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);//获取模型顶点坐标位置。这一一句和上面四句等价
//o.uv = v.texcoord0 * _MainTex_ST.xy + _MainTex_ST.zw;//使用纹理的Tiling和Offset。这一句和下面这句等价
o.uv = TRANSFORM_TEX(v.texcoord0, _MainTex);
float3 pos_world = mul(unity_ObjectToWorld, v.vertex).xyz;
o.pos_world = pos_world;
o.pivot_world = mul(unity_ObjectToWorld, float4(0.0, 0.0, 0.0, 1.0)).xyz;//相对于原点
o.normal = v.normal;
return o;
}
//片元Shader
half4 frag(v2f i) : SV_Target //SV_Target表示为:片元Shader输出的目标地(渲染目标)
{
//流光
half2 uv_flow = (i.pos_world.xy - i.pivot_world.xy) * _FlowTilling.xy;
//half2 uv_flow = i.uv * _FlowTilling.xy;
uv_flow = uv_flow + _Time.y * _FlowSpeed.xy;
float4 flow_rgba = tex2D(_FlowTex, uv_flow) * _FlowIntensity;
fixed4 final_col = tex2D(_MainTex, i.uv) + flow_rgba;
return final_col;
}
ENDCG
}
}
}
效果图:
2.gif