本日はシェーダー枠です。
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 } } }