一. 一个compute文件对应一个函数
二. C#里使用该函数,三大步骤:
1. 开辟ComputeBuffer
2. 把数据传入到ComputBuffer里
3. 执行函数
4. 接收函数执行结果
5. 释放ComputeBuffer
//Compute Shader代码, 后缀为.compute文件
#pragma kernel AddVectors
RWStructuredBuffer<Vector4> inputA;
RWStructuredBuffer<Vector4> inputB;
RWStructuredBuffer<Vector4> output;
[numthreads(64, 1, 1)]
void AddVectors(uint3 id : SV_DispatchThreadID)
{
output[id.x] = inputA[id.x] + inputB[id.x];
}
using UnityEngine;
using UnityEditor;
public class ComputeShaderExample : EditorWindow
{
public ComputeShader computeShader;
public int vectorCount = 1024;
private ComputeBuffer inputBufferA;
private ComputeBuffer inputBufferB;
private ComputeBuffer outputBuffer;
private void Calculate()
{
// 创建输入和输出的Compute Buffer
inputBufferA = new ComputeBuffer(vectorCount, sizeof(float) * 4);
inputBufferB = new ComputeBuffer(vectorCount, sizeof(float) * 4);
outputBuffer = new ComputeBuffer(vectorCount, sizeof(float) * 4);
int kernel = computeShader.FindKernel("AddVectors");
// 填充输入数据
Vector4[] inputA = new Vector4[vectorCount];
Vector4[] inputB = new Vector4[vectorCount];
for (int i = 0; i < vectorCount; i++)
{
inputA[i] = new Vector4(i, i, i, i);
inputB[i] = new Vector4(i, i, i, i);
}
inputBufferA.SetData(inputA);
inputBufferB.SetData(inputB);
// 设置Compute Shader和Compute Buffer
computeShader.SetBuffer(kernel, "inputA", inputBufferA);
computeShader.SetBuffer(kernel, "inputB", inputBufferB);
computeShader.SetBuffer(kernel, "output", outputBuffer);
// 调度Compute Shader执行
computeShader.Dispatch(kernel, Mathf.CeilToInt(vectorCount / 64f), 1, 1);
// 获取输出数据
Vector4[] output = new Vector4[vectorCount];
outputBuffer.GetData(output);
// 打印输出数据
for (int i = 0; i < vectorCount; i++)
{
Debug.Log("Output[" + i + "]: " + output[i]);
}
}
void OnGUI()
{
// 在这里绘制GUI界面
GUILayout.Label("Compute Shader Example", EditorStyles.boldLabel);
if (GUILayout.Button("Calculate"))
{
// 在按钮点击时执行计算
Calculate();
}
}
private void OnEnable()
{
//初始化computeShader变量
computeShader = AssetDatabase.LoadAssetAtPath<ComputeShader>("Assets/ArtTools/GLight/Multiple_Compute.compute");
}
private void OnDestroy()
{
// 释放Compute Buffer
inputBufferA.Release();
inputBufferB.Release();
outputBuffer.Release();
}
[MenuItem("GL Tools/GPU Acceleration Example")]
static void Init()
{
ComputeShaderExample window = (ComputeShaderExample)EditorWindow.GetWindow(typeof(ComputeShaderExample));
window.Show();
}
}