VAF顶点动画和FlowMap 的原理介绍

(1)VAF图片信息:
VAF顶点动画: 将动画信息存储在图片中()
图片大小:2687 * 100:
顶点数量 :2687
动画总帧数:100
在动画播放的时候:每一帧读取一行信息(2687个顶点的偏移值)。
在这里插入图片描述
(2)模型导入时的注意事项:
用于VAF顶点动画的模型,导入时 Optimize Mesh 一定要取消勾选
在这里插入图片描述

(3) VAF的代码:

  1. 注意点: 在图片中存储的uv信息的偏移值,在unity平台下 坐标轴向不同,可能会导致播放的动画是畸形的: XYZ三个轴的方向和unity 不一致导致!!!!!!!
    此处的bug,自己调整, 根据uv坐标采样出的rgb, 三个方向轴 慢慢试~~!!!!!!!!!!

  2. 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
		}
	}
}

猜你喜欢

转载自blog.csdn.net/js0907/article/details/117395543
今日推荐