NoScaleOffset プロパティについて

久々にシェーダーいじって、忘れていたことをメモ

NoScaleOffset 属性

リファレンス

シェーダー宣言のプロパティ。指定すると テクスチャーフィールドから

  • Tiling
  • Offset

がなくなります。

	Properties
	{
		_MainTex("Main Texture", 2D) = "white" {}
		[NoScaleOffset]_ToonMap( "Toon Map", 2D) = "white" {}
	} // Properties
Toon Map に Tiling Offset が無いのがわかります。

テクスチャーをパラメータとして利用する場合などに重宝します。

通常の テクスチャの場合

float4 _MainTex_ST; など宣言し

大抵 TRANSFORM_TEX() マクロに突っ込んで タイリングとオフセットを計算させ、
いい感じで UV を計算します。

こんな感じ

float4 _MainTex_ST;
...
o.uv = TRANSFORM_TEX( v.uv, _MainTex);

UnityCG.cginc内のマクロ定義はこんな感じ

// Transforms 2D UV by scale/bias property
#define TRANSFORM_TEX(tex,name) (tex.xy * name##_ST.xy + name##_ST.zw)

テクスチャ変数_ST; を宣言しておかないとエラーになり怒られます。

Shader error in 'Neko/Toon': undeclared identifier '_MainTex_ST' at line 52 (on d3d11)

初見に優しくない暗黙のルールな設計で、あまり好きでないですね。