actionScript書きの日記

アラフォーFlashデベロッパのブログ。actionscriptやobjective-cを経て、現在はUnity、Spine、AfterEffectsがメイン。

UnityのURPシェーダーでUVスクロールする際のオフセットの取り扱い

UnityのURPシェーダーでUVスクロールをする際にどのように記述するのかを調べてみると、以下のようなコードが出てきた。

float2 offset = float2(_Time.x, 0); 
o.uv = TRANSFORM_TEX(v.uv + offset, _MainTex);

変数「offset」内に、時間経過に比例して増大する値を入れ、関数「TRANSFORM_TEX」を実行する際にoffsetの値をuvに加算することでスクロールを実現している。

このやり方自体は何ら間違ってはいないのだが、一点気になったことがある。それは関数「TRANSFORM_TEX」の処理内容に関してだ。

上記コードではテクスチャ画像として「_MainTex」を使用している。具体的には

sampler2D _MainTex;
float4 _MainTex_ST;

という形で変数が定義されている。

ここで変数「_MainTex_ST」の中身が「TRANSFORM_TEX」の実行内容に関連している。「_MainTex_ST」の型はfloat4なので「x, y, z, w」の4つのパラメータを持つが、この内「x, y」がタイリングの値を、「z, w」がX軸方向とY軸方向へのオフセットの値を示している。これは、このシェーダを適用したマテリアルのInspectorウィンドウに表示される「_MainTex」のパラメータと対応している。

つまり「_MainTex」のUVに関する値は「_MainTex_ST」に格納され、その値を元に「TRANSFORM_TEX」で処理が行われる、ということだ。とすれば、UVスクロールの処理も「_MainTex_ST」内の値に対して行われるべきではないのだろうか。

_MainTex_ST.z = _MainTex_ST.z + _Time.x;
o.uv = TRANSFORM_TEX(v.uv + offset, _MainTex);

こんな感じのイメージ。

いちおうこれでスクロールしてくれるのだが、果たしてこれは正しい書き方なのだろうか??

本件に関しては、以下の記事に大いに助けていただいた。感謝申し上げる。

matcha-choco010.net