(1)VAF图片信息:
VAF顶点动画: 将动画信息存储在图片中()
图片大小:2687 * 100:
顶点数量 :2687
动画总帧数:100
在动画播放的时候:每一帧读取一行信息(2687个顶点的偏移值)。
(2)模型导入时的注意事项:
用于VAF顶点动画的模型,导入时 Optimize Mesh 一定要取消勾选
(3) VAF的代码:
-
注意点: 在图片中存储的uv信息的偏移值,在unity平台下 坐标轴向不同,可能会导致播放的动画是畸形的: XYZ三个轴的方向和unity 不一致导致!!!!!!!
此处的bug,自己调整, 根据uv坐标采样出的rgb, 三个方向轴 慢慢试~~!!!!!!!!!! -
3DMax 做VAF的顶点信息图片中 有正数 也有负数
但是在unity 读取图片 读取不到负数。。。。。。。
3.Hodini 可以导出 只有正数的VAF顶点信息图片。因此: 请拥抱 Houdini!!!
(4)在计算UV 流动的时候, 由于轴心点的值 不一定是你想要的!!!!
此时加一个可调节变量: _PivotOffset 轴心点偏移值!!!!!
(二)FlowMap效果
flowMap :
在noise图的基础上,
采样两次flowMap。 在两次采样结果之间lerp插值,
所以flowMap 的效果是周期性的, 循环往复, 这也是flowmap的缺点
Shader "Unlit/flowMap_code"
{
Properties
{
_Noise ("_Noise", 2D) = "white" {}
_FlowMap ("_FlowMap", 2D) = "white" {}
_NoiseSpeed ("_NoiseSpeed", float) = 1
_NoiseStrength ("_NoiseSpeed", vector) = (1,1,1,1)
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
float2 uv_flow : TEXCOORD1;
float4 vertex : SV_POSITION;
};
sampler2D _Noise,_FlowMap;
float4 _Noise_ST,_FlowMap_ST;
float _NoiseSpeed;
float4 _NoiseStrength;
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _Noise);
o.uv_flow = TRANSFORM_TEX(v.uv, _FlowMap);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
float2 uv = i.uv;
float4 flowCol = tex2D(_FlowMap,i.uv_flow);
flowCol.x = -flowCol.x + 0.5;
float2 timeScale = fract ( _Time.x * _NoiseSpeed) * _NoiseStrength;
float2 uvOffset =( flowCol.rg ) * timeScale;
uv = uv + uvOffset;
float2 uv1 = i.uv;
float2 timeScale1 = fract( _Time.x * _NoiseSpeed + 0.5) * _NoiseStrength;
float2 uvOffset1 = flowCol.rg * timeScale1;
uv1 = uv + uvOffset1;
float lerpFactor = abs(fract(_Time.x * _NoiseSpeed) * 2 - 1);
fixed4 col = tex2D(_Noise, uv);
fixed4 col1 = tex2D(_Noise, uv1);
float4 finalCol = lerp(col,col1,lerpFactor);
return finalCol;
}
ENDCG
}
}
}