murnana's diary

プリントの裏に書くとか、そんな感じです

【Unity】サーフェスシェーダにおける、TRANSFORM_TEXの位置

結論から言うと… TRANSFORM_TEXサーフェスシェーダ内で使用する場合、vertex関数ではなく、surface関数に書かなくてはならない。

頂点シェーダー及びフラグメントシェーダーとは使い方が違うらしい…。たぶん…。 Unityのシェーダに対する詳しいリファレンスはないものか…。

TRANSFORM_TEX概要

Unityでシェーダーをいじっていた時の事。 テクスチャのTilingとOffsetをどうやって取り出すんだーと調べていたら、TRANSFORM_TEXなる存在を知ることができた。 TRANSFORM_TEXの定義はこんな感じ。

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

ここから察するのと調べたものにより、TRANSFORM_TEXを使用するには、定数としてfloat4やharf4などにテクスチャ名_STが必要らしい。

sampler2D _MainTex;
float4    _MainTex_ST;

ここまでは大丈夫。問題はここから。 頂点シェーダー及びフラグメントシェーダーでの使い方はわかったものの、サーフェスシェーダーにて上の結論に行くまでが大変だった。

追ったリンクを張っておきますね。

answers.unity3d.com

answers.unity3d.com

answers.unity3d.com

なぜvertexで使えないのか

詳しい仕組みは…わからん…教えて偉い人。 ちなみに、vertex関数で書くとこのサイトと同じエラーが出る。なんなんだ…

Shader error in 'Custom/GroundShader': redefinition of '_MainTex_ST' at line 83 (on d3d11) Compiling Vertex program with DIRECTIONAL SHADOWS_OFF LIGHTMAP_OFF DIRLIGHTMAP_OFF DYNAMICLIGHTMAP_OF