CS腳本:
using UnityEngine;
public class Control : MonoBehaviour {
public ComputeShader shader;
int[] inputData = new int[2000000];
int[] outputData = new int[2000000];
int[] inputData1 = new int[10000000];
int[] outputData1 = new int[10000000];
ComputeBuffer inputbuffer;
ComputeBuffer outputbuffer;
int k;
private void Start() {
k = shader.FindKernel("CSMain1"); //獲取執行函數的序號
}
private void Update() {
ComputeData(); //GPU
//ComputeData1(); //CPU
}
private void ComputeData() {
ComputeBuffer inputbuffer = new ComputeBuffer(inputData.Length, 4); //定義緩衝區(參數:數組長度、每個數組元素佔用字節數)
ComputeBuffer outputbuffer = new ComputeBuffer(outputData.Length, 4);
inputbuffer.SetData(inputData); //待計算數據加載入緩衝區
shader.SetBuffer(k, "inputData", inputbuffer); //定義輸入口
shader.SetBuffer(k, "outputData", outputbuffer);//定義輸出口
shader.Dispatch(k, 64, 1, 1); //開始執行(參數:主函數下標、線程組的XYZ個數)
outputbuffer.GetData(outputData); //緩衝區獲得計算好的數據
inputbuffer.Dispose(); //清除緩存
outputbuffer.Dispose();
}
private void ComputeData1() {
for (int i = 0; i < inputData1.Length; i++) {
outputData1[i] = inputData1[i] + 999;
}
}
}
Compute Shader代碼:
#pragma kernel CSMain
#pragma kernel CSMain1
StructuredBuffer<int> inputData; //CPU傳過來的數據(CPU->GPU)
RWStructuredBuffer<int> outputData;//計算完要傳出的數據(GPU->CPU)
[numthreads(32, 32, 1)]
void CSMain(uint3 id : SV_DispatchThreadID) {
outputData[id.x] = inputData[id.x] + 999;
}
[numthreads(32, 32, 1)]
void CSMain1(uint3 id : SV_DispatchThreadID) {//計算函數,可有多個
outputData[id.x] = inputData[id.x] + 999;
}