URP は、モーションベクトルレンダーパス を使用してサーフェスフラグメントのフレーム間の画面スペース移動を計算します。URP は移動データを全画面のテクスチャに格納し、格納されたピクセルごとの値は モーションベクトル と呼ばれます。
Unity は、リクエストするレンダーパスを持つアクティブな機能がフレームにある場合にのみ、モーションベクトルレンダーパスを実行します。例えば、Temporal Anti-aliasing や モーションブラー などの URP 機能がモーションベクトルパスをリクエストします。カスタムパスでのモーションベクトルパスのリクエスト方法については、パスでのモーションベクトルテクスチャの使用 セクションを参照してください。
モーションベクトルが正しくない、または欠落していると、それに依存するエフェクトで 視覚的なアーティファクト が発生する可能性があります。このページの手順に従って、オブジェクトレンダラー、マテリアル、およびシェーダーがモーションベクトルをサポートするように正しく設定されていることを確認してください。
モーションベクトルは、アルファクリップされたマテリアルを含めて、不透明なマテリアルに対してのみサポートされます。透明マテリアルに対するモーションベクトルはサポートされません。
このセクションでは、URP がモーションベクトルを実装する方法について説明します。
モーションベクトルは、カメラのニアクリップ面に投影された、直前のフレームからのカメラに対するサーフェスフラグメントの動きを表す 2D ベクトルです。モーションベクトルテクスチャは 2 チャンネル (R と G) を使用します。各テクセルは、各可視サーフェスフラグメントの UV オフセットを格納します。テクセルのモーションベクトルを現在の UV 座標から引くと、直前のフレームでテクセルが画面上で位置していたであろう UV 座標が得られます。計算された直前のフレームの UV 座標は、画面の境界の外側である可能性もあります。
モーションベクトルには 2 つのカテゴリがあります。
カメラモーションベクトル: カメラ自身の動きのみによって発生するモーションベクトル。
オブジェクトモーションベクトル: カメラの動きと、フラグメントが属するオブジェクトのワールド空間での動きの組み合わせによって発生するモーションベクトル。
モーションベクトルテクスチャのみから、画面上のフラグメントの動きがカメラの動きのみによるものか、オブジェクトの動きによるものか、またはその両方の組み合わせによるものかを推測することはできません。
1 つの全画面パスで、カメラモーションベクトルを計算できます。このようなパスには、シーンの複雑さに関係なく、フレームごとの固定の計算負荷があります。知る必要があるのは、画面上の全ピクセルの現在の 3D 位置と、カメラがどのように移動したかだけです。これは、現在および前のフレームの深度バッファとカメラマトリックスから推測できます。
オブジェクトモーションベクトルの計算負荷は、シーン内で移動するオブジェクトの数と複雑さに依存します。これは、各オブジェクトの動きを考慮するためにオブジェクトごとの描画が必要であるためです。各描画では、カメラの動きの影響も適用する必要があります。
以下の 3 つの条件が満たされると、Unity はフレーム内のメッシュのオブジェクトモーションベクトルをレンダリングします。
メッシュに関連付けられたシェーダーが、アクティブな SubShader ブロックに MotionVectors パス を持つ。
メッシュが以下のレンダラーのいずれかでレンダリングされる。
SkinnedMeshRenderer。
MeshRenderer。Motion Vectors プロパティが Camera Motion Only に設定されていない場合。
API Graphics.RenderMesh、Graphics.RenderMeshInstanced、または Graphics.RenderMeshIndirect を使用し、RenderParams 構造体の MotionVectorMode メンバーが Camera に設定されていない場合。
以下の条件のいずれかが真である場合。
MotionVectorGenerationMode プロパティが、MeshRenderer の ForceNoMotion、または Grphics.Render... API の RenderParams.MotionVectorMode 構造体メンバーに設定されている。
ノート:ForceNoMotion オプションでは、このようなオブジェクトのカメラモーションベクトルをゼロで上書きできるように、オブジェクトごとのモーションベクトルパスがフレームごとにレンダリングされる必要があります。
MotionVectors パスが マテリアルで有効 になっている (例えば、マテリアルに Shader Graph や Alembic アニメーションで頂点アニメーションがある場合)。
MotionVectors パスが マテリアルで無効 になっているが、前フレームと現在のフレームのモデルマトリックスが一致しないか、オブジェクトにスケルトンアニメーションがある場合。スケルトンアニメーションのない静止レンダラーは、シェーダーに MotionVectors パスがあるがマテリアルで無効になっている場合に、オブジェクトモーションベクトルパスでレンダリングされません。
事前ビルドシェーダーで MotionVectors パスが有効になっている場合、Unity はメッシュレンダラーが移動しなくてもオブジェクトモーションベクトルをレンダリングします。
以下の条件が真である場合、Unity は事前ビルド URP シェーダーで MotionVectors パスを有効にします。
URP ShaderLab シェーダー: マテリアルで、Alembic Motion Vectors プロパティが Advanced Options セクションで有効になっている。
URP Lit および Unlit Shader Graph シェーダー: Graph Inspector で、以下のプロパティのいずれかが設定されている。