VRChat 非公式日本語ドキュメント

AsyncGPUReadback

Unityの AsyncGPUReadback は、テクスチャなどのGPU上のデータをCPU側のコードへコピーできるようにする機能です。この機能は Texture2D.GetPixels に似ていますが、非同期で動作するためメインスレッドのタスクをブロックしません。

データ転送を非同期で行うことで、Unityはアプリケーションのフレームレートや全体的なパフォーマンスに悪影響を与えないようにします。AsyncGPUReadback を使用すると、メインスレッドと並行してバックグラウンドでデータ転送が行われるため、レンダリングパイプラインを停止させずに済みます。

AsyncGPUReadback の一般的なユースケースには、テクスチャのミップマップチェーンの作成、独自のポストプロセスエフェクトの実装、AIやコンピュータビジョンを目的としたレンダリング済みフレームの解析など、レンダリング結果に基づいたCPU側のデータの生成が含まれます。

UnityのAsyncGpuReadbackとVRCAsyncGpuReadbackの違い

VRChatによるAsyncGpuReadbackの実装は、Unityの機能を呼び出すラッパーを使用しています。このラッパーはインターフェースが異なるため、以下の違いがあります。

その他の共通詳細については、以下のUnity公式ドキュメントを参照してください。

VRCAsyncGpuReadback を使用する

VRCAsyncGpuReadback を使用する場合、以下の4つの主要なステップに従う必要があります。

  1. 使用するデータの配列をセットアップする。
  2. AsyncGpuReadback リクエストを行う。
  3. リクエストが完了したというメッセージを受け取る。
  4. リクエストからデータを取り出す。

Udon Node Graph の例

asyncgpureadback-mu8QGGS.png

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]);
        }
    }
}

最終更新: