Unity的Compute Shader使用
C#部分 ComputeBuffer部分 1、定义Compute Shader使用的ComputeBuffer,即确定要传的数据大小,ComputeBuffer构造体函数两个参数,第一个参数是结构体的长度,第二个参数是结构体本身的大小(字节) 2、传递参数的时候,需要预设数据,然后调用ComputeBuffer的SetData()函数 ComputeShader部分 1、定义好函数的入口索引值,ComputeShader默认函数入口名字是CSMain 2、传递参数的时候,如果是较为复杂的数据结构,使用ComputeShader的SetBuffer()函数,此外ComputeShader还提供了SetFloat()等较为常见的函数 3、之后需要分配线程组,调用ComputeShader的Dispatch()函数,该函数有四个参数,第一个参数是ComputeShader函数入口的索引,第二、三、四个参数为线程组在x、y、z方向的数量,相当于长方体点阵 4、如果需要获取计算的结果,有两种方式 ①调用ComputeBuffer的GetData函数 ②使用Graphics.DrawMeshInstancedIndirect来根据Compute Buffer绘制图形
Compute Shader部分 1、ComputeShader里面的声明带有RW表示可读和可写,用来在CPU计算后传递回给CPU,没有声明RW的主要是从CPU传递给GPU 2、每个函数入口都需要声明一个宏,如#pragma kernel CSMain,CSMain为函数入口的名称 3、每个函数入口前都要定义好每个线程组的线程数量,和上述提到的ComputeShader的Dispatch()函数类似,线程在每个线程组中的存储方式是类似于长方体点阵 4、函数入口的参数中SV_DispatchThreadID代表该线程在整个线程组中的具体位置,红色对应C#中ComputeShader的Dispatch()函数,绿色对应Compute Shader中的 numthreads,蓝色为SV_DispatchThreadID,如图所示。 5、除了SV_DispathThreadID之外,前面提到的线程组索引和线程数索引都可以在函数入口的参数中自行定义,分别为SV_GroupID和SV_GroupThreadID 6、Compute Shader输出的时候是线程组同步的,所以使用的时候自行定义好输入的参数。
|