ComputeShader需要脚本来调用
/* * test.compute */ // main函数,一个compute shader多个kernal函数,使用时在脚本中手动指定调用哪一个 #pragma kernel CSMain // 声明一可读写贴图 RWTexture2D<float4> Result; // numthreads:创建线程组的大小,也就是一个线程组包含多少个线程,下面的指令表示:指定每个线程组包含64个线程 // id:该线程所在的总的线程结构中的索引 [numthreads(8,8,1)] void CSMain (uint3 id : SV_DispatchThreadID) { Result[id.xy] = float4(id.x & id.y, (id.x & 15)/15.0, (id.y & 15)/15.0, 0.0); } /* * 调用test.compute的cs脚本 */ public ComputeShader shader; void RunShader() { int kernelHandle = shader.FindKernel("CSMain"); RenderTexture tex = new RenderTexture(256,256,24) // 手动标记为可随机读写 tex.enableRandomWrite = true; tex.Create(); // 把CPU的数据传到GPU(在不同的存储空间移动数据会产生延迟,使用时需要考虑优化) shader.SetTexture(kernelHandle, "Result", tex); // 指定线程组是如何划分的 shader.Dispatch(kernelHandle, 256/8, 256/8, 1); }
Structured Buffers:一种数据类型的一个数组,可以是浮点数、整数、结构体:
StructuctedBuffer<float> floatBuffer; RWStructuredBuffer<int> readWriteIntBuffer; struct VecMatPair { public Vector3 point; public Matrix4x4 matrix; } RWStructuredBuffer<VecMatPair> dataBuffer;
/* * test.compute */ #pragma kernel Multiply struct VecMatPair { float3 pos; float4x4 mat; }; RWStructuredBuffer<VecMatPair> dataBuffer; [numthreads(16,1,1)] void Multiply (uint3 id : SV_DispatchThreadID) { dataBuffer[id.x].pos = mul(dataBuffer[id.x].mat, float4(dataBuffer[id.x].pos, 1.0)); } /* * 调用test.compute的cs脚本 */ public ComputeShader shader; void RunShader() { VecMatPair[] data = new VecMatPair[5]; VecMatPair[] output = new VecMatPair[5]; //INITIALIZE DATA HERE // 76 = 3个float + 4*4个float,buffer需要手动指定大小为多少个byte ComputeBuffer buffer = new ComputeBuffer(data.Length, 76); buffer.SetData(data); int kernel = shader.FindKernel("Multiply"); // 设置buffer shader.SetBuffer(kernel, "dataBuffer", buffer); shader.Dispatch(kernel, data.Length, 1,1); // 和texture不一样,structured buffers需要明确的从GPU存储空间转移到CPU(性能消耗非常大,一般只有需要从shader中拉数据时才需要用到) buffer.GetData(output); }
原文:https://www.cnblogs.com/sifenkesi/p/11374615.html