レンダリングをスピードアップするには、フレームバッファフェッチを使用して、Unity がこれまでにレンダリングしたフレームを読み込みます。
フレームバッファフェッチを使用すると、レンダーパスは、ビデオメモリではなく、GPU のオンチップメモリからフレームバッファにアクセスできます。これにより、GPU がビデオメモリとの間でテクスチャをコピーする必要がなくなるため、レンダリングが高速化されます。
フレームバッファフェッチは、以下のグラフィックス API のいずれかを使用する場合にサポートされます。
フレームバッファフェッチは、タイルベースのディファードレンダリング (TBDR) を使用するモバイルデバイスでのレンダリングを大幅に高速化します。GPU は、レンダーパス間でフレームをオンチップのタイルメモリに保持し、使用するメモリ帯域幅と処理時間を削減します。
フレームバッファフェッチを使用する場合、URP は、フレームバッファへの書き込みとフレームバッファからの読み取りを行うレンダーパスをマージします。これは、Render Graph Viewer ウィンドウで確認できます。
レンダーパスでフレームバッファフェッチを使用するには、以下のものを使用します。
SetInputAttachment API (前のレンダーパスの出力を、新しいレンダーパスの入力として設定する)LOAD_FRAMEBUFFER_X_INPUT マクロ (SAMPLE_TEXTURE2D などのマクロの代わりに、前のレンダーパスの出力をサンプリングする)以下の手順は、sourceTextureHandle と呼ばれる TextureHandle に書き込むレンダーパスがすでに 1 つあることを前提としています。
カスタムシェーダーを作成し、そのシェーダーからマテリアルを作成します。カスタムシェーダーの作成の詳細については、カスタムシェーダーの記述を参照してください。
カスタムシェーダーの HLSLPROGRAM 内で、Packages/com.unity.render-pipelines.core/Runtime/Utilities/Blit.hlsl ファイルがインポートされるようにします。
HLSLPROGRAM
...
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
...
ENDHLSL
HLSLPROGRAM 内で以下のいずれかを使用して、前のレンダーパスのテクスチャを宣言します。例:
FRAMEBUFFER_INPUT_X_HALFFRAMEBUFFER_INPUT_X_FLOATFRAMEBUFFER_INPUT_X_INTFRAMEBUFFER_INPUT_X_UINT例:
FRAMEBUFFER_INPUT_X_HALF(0);
フラグメント関数で、LOAD_FRAMEBUFFER_X_INPUT を使用してフレームバッファフェッチを使用してテクスチャをサンプリングします。例:
half4 frag() : SV_Target
{
half4 colorFromPreviousRenderPass = LOAD_FRAMEBUFFER_X_INPUT(0, input.positionCS.xy);
return colorFromPreviousRenderPass;
}
新しいレンダーグラフのレンダーパスで、作成したマテリアルを PassData に追加します。例:
class PassData
{
public Material frameBufferFetchMaterial;
}
builder.SetInputAttachment を使用して、前のレンダーパスの出力を新しいレンダーパスの入力として設定します。例:
builder.SetInputAttachment(sourceTextureHandle, 0, AccessFlags.Read);
SetRenderFunc メソッドで BlitTexture などのコマンドを使用し、マテリアルを使用してレンダリングします。例:
static void ExecutePass(PassData data, RasterGraphContext context)
{
Blitter.BlitTexture(context.cmd, new Vector4(1, 1, 0, 0), frameBufferFetchMaterial, 1);
}
完全な例については、レンダーグラフシステムの URP パッケージサンプルで FrameBufferFetch という例を参照してください。