夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

ゼロから始めるUnityShader開発 _Time関数のヌマ

本日はshader枠です。

UnityでShaderを書く際にアニメーションなど時間軸を使いたい場合は_Timeを使用することが一般的です。

しかしながらこのTime関数をShaderLabで使用する際には注意が必要です。

〇_Time

_TimeはUnityCG.cgincで定義されている変数で、Shader内で再定義することなく使用することができます。

 例えば次の例では、uvとして出力する際に_Timeを使用してuvが動くようになっています。

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv + (_Time*0.05), _MainTex);
                return o;
            }

このようにShader内で時間を使う際は_Timeを使います。

〇_Timeの注意点

この例でも発生していますが、本来UVはx,yの2成分を持っていますが、一方のみに動いて見えてしまってます。

ShaderGraphを使用していると特に問題はないのですが、_Timeは4次元ベクトルで、成分ごとに時間軸の扱いが異なっています。

https://docs.unity3d.com/ja/2020.3/Manual/SL-UnityShaderVariables.html

ShaderLabを使用して記述するときに_Timeをかけ合わせる際は_Time.xなど成分を明示的に記述する必要があります。

つまり上記の例では次のように変更することで正しくスクロールを使用することができます。

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv + (float2(_Time.x,_Time.x)*0.05), _MainTex);
                return o;
            }

_Time.yがx成分に比べ40倍の時間を使用しているため成分ごとの値の違いに気が付かないとうまく行いたい表現をすることができない場面があります。

今回は実際に筆者が1時間ほど時間を取られてしまったので記事にしました。