本日はシェーダー枠です。
3Dモデルが持てる情報にUVがありますが、UVは複数持つことができます。

今回は任意に複数のUVを切り替えるシェーダーを書いていきます。
〇複数のUVを切り替えるシェーダー
通常頂点シェーダーに渡す情報を定義する構造体で3Dモデルの持つ情報からどの情報を処理するかを定義します。
uvは
float2 uv : TEXCOORD0;
というようにTEXCORD0セマンティクスを使用することで定義しますが、TEXCOORD1と定義することで2つ目のUVを使用することができます。
これを使用して任意に使用するデータを切り替えるようにします。
これはPropertiesブロックで[Toggle(_UV2)]のように定義してUnityのマテリアルパラメータ上でチェックボックスとして使用できるようにします。
Properties
{
_MainTex ("Texture", 2D) = "white" {}
[Toggle(_UV2)] _UV2("Use UV2", Float) = 0
}
この値に応じて内部処理を分岐できるように#pragma shader_featurを使用し シェーダー内部の頂点シェーダーでプリプロセッサを使用して1つ目のUVを使用するか2つ目のUVを使用するかを変えれるようにします。
#pragma shader_feature _UV2
struct appdata
{
#if defined(_UV2)
float2 uv : TEXCOORD0;
#else
float2 uv : TEXCOORD1;
#endif
};
これによってUVを切り替えて使用できるようになります。
〇シェーダー全文
Shader "Unlit/MultiUV"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
[Toggle(_UV2)] _UV2("Use UV2", Float) = 0
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma shader_feature _UV2
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
#if defined(_UV2)
float2 uv : TEXCOORD0;
#else
float2 uv : TEXCOORD1;
#endif
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
};
sampler2D _MainTex;
float4 _MainTex_ST;
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
fixed4 col = tex2D(_MainTex, i.uv);
return col;
}
ENDCG
}
}
}