Version: Unity 6.0 (6000.0)
言語 : 日本語
カメラ履歴にテクスチャを追加する
URP のフレームデータテクスチャのリファレンス

URP のフレームバッファフェッチによる現在のフレームバッファの取得

レンダリングをスピードアップするには、フレームバッファフェッチを使用して、Unity がこれまでにレンダリングしたフレームを読み込みます。

フレームバッファフェッチを使用すると、レンダーパスは、ビデオメモリではなく、GPU のオンチップメモリからフレームバッファにアクセスできます。これにより、GPU がビデオメモリとの間でテクスチャをコピーする必要がなくなるため、レンダリングが高速化されます。

フレームバッファフェッチは、以下のグラフィックス API のいずれかを使用する場合にサポートされます。

  • Vulkan
  • Metal

フレームバッファフェッチは、タイルベースのディファードレンダリング (TBDR) を使用するモバイルデバイスでのレンダリングを大幅に高速化します。GPU は、レンダーパス間でフレームをオンチップのタイルメモリに保持し、使用するメモリ帯域幅と処理時間を削減します。

フレームバッファフェッチを使用する場合、URP は、フレームバッファへの書き込みとフレームバッファからの読み取りを行うレンダーパスをマージします。これは、Render Graph Viewer ウィンドウで確認できます。

フレームバッファフェッチの使用

レンダーパスでフレームバッファフェッチを使用するには、以下のものを使用します。

  • SetInputAttachment API (前のレンダーパスの出力を、新しいレンダーパスの入力として設定する)
  • フラグメントシェーダーコードの LOAD_FRAMEBUFFER_X_INPUT マクロ (SAMPLE_TEXTURE2D などのマクロの代わりに、前のレンダーパスの出力をサンプリングする)

以下の手順は、sourceTextureHandle と呼ばれる TextureHandle に書き込むレンダーパスがすでに 1 つあることを前提としています。

  1. カスタムシェーダーを作成し、そのシェーダーからマテリアルを作成します。カスタムシェーダーの作成の詳細については、カスタムシェーダーの記述を参照してください。

  2. カスタムシェーダーの HLSLPROGRAM 内で、Packages/com.unity.render-pipelines.core/Runtime/Utilities/Blit.hlsl ファイルがインポートされるようにします。

    HLSLPROGRAM
    ...
    #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
    ...
    ENDHLSL
    
  3. HLSLPROGRAM 内で以下のいずれかを使用して、前のレンダーパスのテクスチャを宣言します。例:

    • FRAMEBUFFER_INPUT_X_HALF
    • FRAMEBUFFER_INPUT_X_FLOAT
    • FRAMEBUFFER_INPUT_X_INT
    • FRAMEBUFFER_INPUT_X_UINT

    例:

    FRAMEBUFFER_INPUT_X_HALF(0);
    
  4. フラグメント関数で、LOAD_FRAMEBUFFER_X_INPUT を使用してフレームバッファフェッチを使用してテクスチャをサンプリングします。例:

    half4 frag() : SV_Target
    {
        half4 colorFromPreviousRenderPass = LOAD_FRAMEBUFFER_X_INPUT(0, input.positionCS.xy);
        return colorFromPreviousRenderPass;
    }
    
  5. 新しいレンダーグラフのレンダーパスで、作成したマテリアルを PassData に追加します。例:

    class PassData
    {
        public Material frameBufferFetchMaterial;
    }
    
  6. builder.SetInputAttachment を使用して、前のレンダーパスの出力を新しいレンダーパスの入力として設定します。例:

    builder.SetInputAttachment(sourceTextureHandle, 0, AccessFlags.Read);
    
  7. SetRenderFunc メソッドで BlitTexture などのコマンドを使用し、マテリアルを使用してレンダリングします。例:

    static void ExecutePass(PassData data, RasterGraphContext context)
    {
        Blitter.BlitTexture(context.cmd, new Vector4(1, 1, 0, 0), frameBufferFetchMaterial, 1);
    }
    

完全な例については、レンダーグラフシステムの URP パッケージサンプルFrameBufferFetch という例を参照してください。

追加リソース

カメラ履歴にテクスチャを追加する
URP のフレームデータテクスチャのリファレンス