URPのShader変数_Timeの実装について

追記

2021/06/30:Time.realtimeSinceStartupの説明を変更しました。
2021/07/01:HDRPの定義を追加
2021/09/10:ShaderGraphのTimeの参考資料と説明を追加

前書き

Built-in Render PipelineUniversal Render PipelineでShaderで使用できる_Timeの実装が違うらしいので調べてみました。


注意点

今回HDRPの_Timeの実装は見ていません。
追記しました。


環境

Unity 2020.3.12f1
Universal RP 10.5.0
High Definition RP 10.5.0


Built-in Render Pipelineの_Time

ドキュメントを見てみると、ステージ(レベル)のロードからの時間と書かれています。
ここで言うステージはたぶんシーンのことを指すと思うので、シーンをロードすると毎回0から始まるようです。
docs.unity3d.com


Universal Render Pipelineの_Time

ここに自動生成される際の実装コードのサンプルがあるでこちらを見たほうが早いです。
docs.unity3d.com

URPで_Timeを設定している箇所はRuntime/ScriptableRender.csSetShaderTimeValues関数で行っており、呼び出し元はExecute関数です。
そこに設定するためのtime変数の定義があります。
github.com
定義は以下の通りです。

#if UNITY_EDITOR
    float time = Application.isPlaying ? Time.time : Time.realtimeSinceStartup;
#else
    float time = Time.time;
#endif
    float deltaTime = Time.deltaTime;
    float smoothDeltaTime = Time.smoothDeltaTime;
    ...
    SetShaderTimeValues(cmd, time, deltaTime, smoothDeltaTime);

コードを見ると、エディタ上ではプレイ中だとTime.time、非プレイ中だとTime.realtimeSinceStartupを入れています。
エディタ上でない場合はTime.timeを入れています。

確かに_Timeの実装が異なっているが確認できます。

おまけ:Time.realtimeSinceStartupって何?

名前の通りですが、アプリケーションを起動してからの時間です。
Time.timeScaleに影響しないのでゲーム中に一時停止に時間を計りたい、アニメーションさせたい場合は良さそうかもしれません。
ただ、プラットフォームやハードウェア依存なので気を付ける必要がありそうです。
docs.unity3d.com


High Definition Render Pipelineの_Time

HDRPはRuntime/RenderPipeline/Camera/HDCamera.csUpdate関数で定義されています。
github.com
定義は以下の通りです。

#if UNITY_EDITOR
    newTime = Application.isPlaying ? Time.time : Time.realtimeSinceStartup;
    deltaTime = Application.isPlaying ? Time.deltaTime : 0.033f;
#else
    newTime = Time.time;
    deltaTime = Time.deltaTime;
#endif
    time = newTime;
    lastTime = newTime - deltaTime;

time変数が_Timeに代入されている値です。
実装自体はURPと変わらないようです。


最後に

実装が異なっていましたが、あまり影響はなさそう雰囲気でした。