Unity2018は新しいインターフェイスに入社、あなたは非同期RenderTexture->にTexture2Dおよび非同期ComputeBuffer.GetDataを行うことができます
その後、次のテストするためにいくつかの例を記述します。
1.RenderTexture->にTexture2D
非同期:
IEnumeratorを開始() { VARの RT = 新しい RenderTexture(512、512、0 ); // Graphics.xxx ... するvar reqは= AsyncGPUReadback.Request(RT); 収量は 返す 新しい WaitUntilにより(()=> req.doneを)。 するvarテックス= 新にTexture2D(512、512、TextureFormat.RGBA32、偽); VAR colorArray = req.GetData <Color32> ().ToArray(); tex.SetPixels32(colorArray)。 tex.Apply(); }
同期:
RenderTexture.active = 室温; するvarテックス= 新にTexture2D(512、512、TextureFormat.RGBA32、偽); tex.ReadPixels(新規のRect(0、0、512、512)、0、0、偽)。 tex.Apply();
2.AsyncGPUReadbackのGetData
CS:
#pragmaカーネルCSMain 構造体TESTDATA { するfloat3 POS。 }。 RWStructuredBuffer <TESTDATA> のMyData; [NumThreadsに(8、1、1 )] ボイドCSMain(uint3 ID:SV_DispatchThreadID) { のMyData [id.x] .POS =のMyData [id.x] .POS * 2 。 }
非同期:
パブリック クラスComputeShaderAsyncRequest:MonoBehaviour { パブリック 構造体TESTDATA { 公共するVector3 POS。 } 公共ComputeShader computeShader。 IEnumeratorを開始() { VAR kernelID = computeShader.FindKernel(" CSMain " )。 VAR TESTDATA = 新しいリスト<TESTDATA> (); 以下のために(int型 i = 0 ; iは< 64 ; iは++ ) testData.Add(新しい TESTDATA(){POS = 新しいですVector3(I、0、0 )})。 VAR computeBuffer = 新しい ComputeBuffer(testData.Count、12 ); computeBuffer.SetData(テストデータ)。 computeShader.SetBuffer(kernelID、" MyDataに" 、computeBuffer)。 computeShader.Dispatch(kernelID、8、1、1 )。 VaRの要求= AsyncGPUReadback.Request(computeBuffer)。 DEBUG.LOG(" フレーム1:" + Time.frameCount)。// 1つの 収量 を返す 新しいですWaitUntilにより(()=> request.done)。 DEBUG.LOG(" フレーム2:" + Time.frameCount)。// 4 VAR testDataArray = request.GetData <TESTDATA> ().ToArray(); 用(int型 iは= 0 ; iがtestDataArray.Lengthを<Iは++ ) (DEBUG.LOG " 私" + I + " 項目:" + testDataArray [I] .POS)。 } }
同期:
パブリック クラスComputeShaderAsyncRequest_Sync:MonoBehaviour { パブリック 構造体TESTDATA { 公共するVector3 POS。 } 公共ComputeShader computeShader。 無効スタート() { VAR kernelID = computeShader.FindKernel(" CSMainを" ); VAR TESTDATA = 新しいリスト<TESTDATA> (); 以下のために(int型 i = 0 ; iは< 64 ; iは++ ) testData.Add(新しい TESTDATA(){POS = 新しいですVector3(I、0、0 )})。 VAR computeBuffer = 新しい ComputeBuffer(testData.Count、12 ); computeBuffer.SetData(テストデータ)。 computeShader.SetBuffer(kernelID、" MyDataに" 、computeBuffer)。 computeShader.Dispatch(kernelID、8、1、1 )。 VaRの配列= 新しいTESTDATA [testData.Count]。 computeBuffer.GetData(アレイ) 以下のために(int型私= 0 ;私<Array.lengthと、私は++ ) DEBUG.LOG(" I:" + I + " 項目:" + 配列[i]の.POS)。 } }