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