Compute Shader
总结一下自己对Compute Shader的理解,虽然不属于渲染管线的任何一个步骤,但是可以与CPU去做数据交换,可以使用GPU去并行计算复杂的东西。
它的核心思想就是分组,每一组分别去并行计算。
比较难理解的就是numthread的概念,它是一个三维的id号,对应着每个需要执行的线程,在computeshader里定义的(8,8,1)就是一个执行的线程组,它一共有64个线程。我们需要在cs里面dispatch的就是需要多少个线程组。对于一个256×256的texture,x方向上需要256/8个线程组,y方向上同理,所以一共需要32×32个线程组,一共就是32 × 32 × 64个线程。而且完全可以自定义numthread是怎样的,比如(2,2,4),这样一来它处理的就是一个三维的输入。
假如对于一个256×128的2D Texture,就有以下的配置方式:
只要Dispatch * numthreads 是图片大小,那么图片就能完全显示,不会漏像素。
在指定某个kernel的线程组数的时候先得到它的入口函数ID号就行,kernel在NVIDA的说法里是CUDA core。这个入口函数的input就是一个uint3的变量,代表着马上要执行的线程的编号。
对于数据的传输,就是用RWStructBuffer去实现,这个需要注意的就是在cs里new的时候要准确给出一个struct buffer的大小以及有几个这样的structure,它就是GPU为了存数据开的一个buffer。我们需要在cs和shader里面struct一样的结构,然后cs里面用setbuffer把ComputeBuffer指定給Compute Shader中的RWStructuredBuffer,这样就可以把数据交给compute shader计算。