AsyncGPUReadback
UnityのAsyncGPUReadbackは、GPU上のテクスチャから特定のピクセルの色などのデータをCPU上のコードへコピーできるようにする機能です。この機能は Texture2D.GetPixels に似ていますが、非同期で実行されるためメインスレッドのタスクをブロックしません。
データを非同期で転送することで、Unityはアプリケーションのフレームレートや全体的なパフォーマンスに悪影響を与えないようにしています。データ転送はメインスレッドと並行してバックグラウンドで行われるため、AsyncGPUReadbackを使用することで、開発者はレンダリングパイプラインの停止を回避できます。
AsyncGPUReadbackの一般的な使用例には、レンダリングされた出力に基づいてCPU側のデータを生成すること(テクスチャのミップマップチェーンの作成、カスタムポストプロセスエフェクトの実装、AIやコンピュータビジョン目的でのレンダリング済みフレームの分析など)が含まれます。
UnityのAsyncGpuReadbackとVRCAsyncGpuReadbackの違い
VRChatにおけるAsyncGpuReadbackの実装では、Unityの関数を呼び出すラッパーが採用されています。このラッパーは異なるインターフェースを使用しており、その違いは以下の通りです。
- AsyncGpuReadbackを呼び出す代わりに、VRCAsyncGpuReadbackを使用する必要があります。
Action<AsyncGPUReadbackRequest> callbackを提供する代わりに UdonBehaviour を指定すると、その UdonBehaviour が読み取り完了時にOnAsyncGpuReadbackCompleteを受け取ります。- 読み取り完了時に
GetDataを使用する代わりに、TryGetDataを使用する必要があります。
その他の詳細については、この機能に関する Unity のドキュメントを参照してください:
VRCAsyncGpuReadback の使用
VRCAsyncGpuReadback を使用する際は、以下の4つの主な手順に従う必要があります:
- 使用するデータの配列を準備する。
- AsyncGpuReadback リクエストを行う
- リクエスト完了時にメッセージを受け取る
- リクエストからデータを取得する
Udon ノードグラフの例

UdonSharpの例
using UdonSharp;
using UnityEngine;
using VRC.SDK3.Rendering;
using VRC.Udon.Common.Interfaces;
public class AGPURB : UdonSharpBehaviour
{
public Texture texture;
void Start()
{
VRCAsyncGPUReadback.Request(texture, 0, (IUdonEventReceiver)this);
}
public void OnAsyncGpuReadbackComplete(VRCAsyncGPUReadbackRequest request)
{
if (request.hasError)
{
Debug.LogError("GPU readback error!");
return;
}
else
{
var px = new Color32[texture.width * texture.height];
Debug.Log("GPU readback success: " + request.TryGetData(px));
Debug.Log("GPU readback data: " + px[0]);
}
}
}
最終更新: