unity-shader-max导出多套uv给unity使用


title: unity-shader-max导出多套uv给unity使用
categories: Unity3d-Shader
tags: [unity, shader, uv, max, uv sets]
date: 2019-05-22 00:03:14
comments: false

在看 GPU Gems 2 的 草 的时候, 看到里面的 风 在影响顶点的时候, 这个技巧是在顶点定义中带一个混合权重 (参考: [《GPU%20Gems%202》全书提炼总结/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 中也可以看出来

unity-shader-max导出多套uv给unity使用_第1张图片


max 添加多套 uv

  1. 添加一个 uv展开 修改器, 贴图通道 默认指定为1 (也就是第一套 uv), 然后编辑 uv, 编辑完 塌陷 这个修改器. 第一套 uv 制作完

  2. 再添加一个 uv展开 修改器, 贴图通道 指定为2 (也就是第二套 uv), 此时会谈个提示框, 选择 放弃 ( 选择 移动 的话会把之前的 uv 移到第二套 uv 上), 然后编辑 uv, 编辑完 塌陷 这个修改器. 第二套 uv 制作完.
    如此类推可以继续添加多套 uv, 如果第二套 uv 想在第一套的基础上修改, 可以在 第一套 uv 中保存一下, 在编辑第二套 uv 时加载进来.

  3. 丢到 unity 中, 可以看到模型里包含的几套uv ( uv,uv2,uv3… )

    unity-shader-max导出多套uv给unity使用_第2张图片


unity 使用多套 uv

  • 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
            }
        }
    }
    
    
  • 效果

    unity-shader-max导出多套uv给unity使用_第3张图片

你可能感兴趣的:(Unity3d,Unity3D,Unity3D-Shader)