Unity で Unlit の Shader を作成すると以下のテンプレートコードが生成される
※ 本来は Fog の設定があるが消している
Shader "Unlit/NewUnlitShader" { Properties { _MainTex ("Texture", 2D) = "white" {} } SubShader { Tags { "RenderType"="Opaque" } Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; 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 { return tex2D(_MainTex, i.uv); } ENDCG } } }
よくよく見てみると float4 _MainTex_ST
が定義されているが、このコード上では利用されてない模様
しかし、消してしまうとエラーが表示される
Shader error in 'Unlit/NewUnlitShader': undeclared identifier '_MainTex_ST' at line 42 (on metal)
ということでエラー箇所を見てみると UnityCG.cginc
内の TRANSFORM_TEX
を呼び出している模様
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
Unity のアーカイブから、Built-in Shader をひっぱってきて該当コードを見てみる
/Users/hatch/Downloads/builtin_shaders-2020.2.2f1/CGIncludes/UnityCG.cginc: 440 441 // Transforms 2D UV by scale/bias property 442: #define TRANSFORM_TEX(tex,name) (tex.xy * name##_ST.xy + name##_ST.zw) 443 444 // Deprecated. Used to transform 4D UV by a fixed function texture matrix. Now just returns the passed UV.
_MainTex_ST
の xy
と zw
を参照している
これは Texture の Tiling
と Offset
に該当する
つまりこの値を反映するために定義が必要だったということ
そもそも Tiling や Offset は不要な場合
ShaderLab には Tiling
と Offset
を利用しない場合 NoScaleOffset
というプロパティを定義すると
[NoScaleOffset] _MainTex ("Texture", 2D) = "white" {}
Texture のパラメータ部分から Tiling
と Offset
を消すことができる
そのため、_MainTex_ST
を記述する必要が無く vert
周りの処理は以下のように記述できる
sampler2D _MainTex; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = v.uv; return o; }