AsyncGPUReadback
Unityの AsyncGPUReadback は、テクスチャなどのGPU上のデータをCPU側のコードへコピーできるようにする機能です。この機能は Texture2D.GetPixels に似ていますが、非同期で動作するためメインスレッドのタスクをブロックしません。
データ転送を非同期で行うことで、Unityはアプリケーションのフレームレートや全体的なパフォーマンスに悪影響を与えないようにします。AsyncGPUReadback を使用すると、メインスレッドと並行してバックグラウンドでデータ転送が行われるため、レンダリングパイプラインを停止させずに済みます。
AsyncGPUReadback の一般的なユースケースには、テクスチャのミップマップチェーンの作成、独自のポストプロセスエフェクトの実装、AIやコンピュータビジョンを目的としたレンダリング済みフレームの解析など、レンダリング結果に基づいたCPU側のデータの生成が含まれます。
UnityのAsyncGpuReadbackとVRCAsyncGpuReadbackの違い
VRChatによるAsyncGpuReadbackの実装は、Unityの機能を呼び出すラッパーを使用しています。このラッパーはインターフェースが異なるため、以下の違いがあります。
AsyncGpuReadbackを呼び出す代わりに、VRCAsyncGpuReadbackを使用する必要があります。Action<AsyncGPUReadbackRequest> callbackを渡す代わりに、UdonBehaviourを渡します。その後、読み取り(Readback)が完了すると、そのUdonBehaviourがOnAsyncGpuReadbackCompleteを受け取ります。- 読み取り完了後に
GetDataを使用する代わりに、TryGetDataを使用する必要があります。
その他の共通詳細については、以下のUnity公式ドキュメントを参照してください。
VRCAsyncGpuReadback を使用する
VRCAsyncGpuReadback を使用する場合、以下の4つの主要なステップに従う必要があります。
- 使用するデータの配列をセットアップする。
- AsyncGpuReadback リクエストを行う。
- リクエストが完了したというメッセージを受け取る。
- リクエストからデータを取り出す。
Udon Node Graph の例

UdonSharpの例
using UdonSharp;
using UnityEngine;
using VRC.SDK3.Rendering;
public class AGPURB : UdonSharpBehaviour
{
public Texture texture;
void Start()
{
VRCAsyncGPUReadback.Request(texture, 0, 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]);
}
}
}
最終更新: