在看 GPU Gems 2 的 草 的时候, 看到里面的 风 在影响顶点的时候, 这个技巧是在顶点定义中带一个混合权重 (参考: [《GPU Gems 2》全书提炼总结/Part1#124-风](https://github.com/QianMo/Game-Programmer-Study-Notes/tree/master/Content/《GPU Gems 2》全书提炼总结/Part1#124-风)) , 那么这个 权重 就可以放在 顶点色 或 uv 中. 如果放在 uv 中, 那么久需要多套 uv 了.
unity 目前只支持顶点存 四套uv. (从源码上看出来)
namespace UnityEngine.Rendering { public enum UVChannelFlags { UV0 = 1, UV1 = 2, UV2 = 4, UV3 = 8 } }shader graph 中也可以看出来
添加一个 uv展开 修改器, 贴图通道 默认指定为1 (也就是第一套 uv), 然后编辑 uv, 编辑完 塌陷 这个修改器. 第一套 uv 制作完
再添加一个 uv展开 修改器, 贴图通道 指定为2 (也就是第二套 uv), 此时会谈个提示框, 选择 放弃 ( 选择 移动 的话会把之前的 uv 移到第二套 uv 上), 然后编辑 uv, 编辑完 塌陷 这个修改器. 第二套 uv 制作完. 如此类推可以继续添加多套 uv, 如果第二套 uv 想在第一套的基础上修改, 可以在 第一套 uv 中保存一下, 在编辑第二套 uv 时加载进来.
丢到 unity 中, 可以看到模型里包含的几套uv ( uv,uv2,uv3… )
shader, 拿最简单的 unlit shader 改一下
Shader "test/multiUV" { Properties { _MainTex ("Texture", 2D) = "white" {} [KeywordEnum(UV0, UV1, UV2)] _UVSet ("UV Set for textures", Float) = 0 } SubShader { Tags { "RenderType"="Opaque" } LOD 100 Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag // make fog work #pragma multi_compile_fog #pragma multi_compile _UVSET_UV0 _UVSET_UV1 _UVSET_UV2 #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float2 texUV0 : TEXCOORD0; float2 texUV1 : TEXCOORD1; // 多套uv的语义声明 float2 texUV2 : TEXCOORD2; }; struct v2f { float2 uv : TEXCOORD0; UNITY_FOG_COORDS(1) float4 vertex : SV_POSITION; }; sampler2D _MainTex; float4 _MainTex_ST; half _UVSet; v2f vert (appdata v) { v2f o; #if _UVSET_UV0 float2 dstUv = v.texUV0; #elif _UVSET_UV1 float2 dstUv = v.texUV1; #else float2 dstUv = v.texUV2; #endif o.vertex = UnityObjectToClipPos(v.vertex); o.uv = TRANSFORM_TEX(dstUv, _MainTex); UNITY_TRANSFER_FOG(o,o.vertex); return o; } fixed4 frag (v2f i) : SV_Target { fixed4 col = tex2D(_MainTex, i.uv); UNITY_APPLY_FOG(i.fogCoord, col); return col; } ENDCG } } }效果