compute shader 模板

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章