ComputeShader
文章目录
一、学习链接
用GPU代替CPU进行计算:
- 定义核函数:可以定义很多个,最终会在GPU中被执行
csharp
#pragma kernel CSMain
- 定义纹理:RWTexture2D可读写,默认的Texture2D只可读
csharp
RWTexture2D<float4> Result;
- 定义线程组,其中定义了线程的数量
csharp
[numthreads(8,8,1)]
- uint3 id : SV_DispatchThreadID
大佬博客讲的很详细,简而言之就是可以根据内置进行多线程处理每个像素,在dispatch时,根据纹理大小和线程数量进行设置线程组数量:dispatch(1024/8, 1024/8, 1)
二、案例学习
1.FallingSand
关键代码解析:
简而言之在ComputeShader里将每个像素根据RGB通道的不同进行设置为障碍和沙子,然后在核函数里判断是否能向下移动,如果遇到障碍物则加上水平位移。
csharp
if(p.x == 1)
{
//move down
//向下移动
int2 direction = int2( 0 , -1 );
int2 pID_new = pID+direction;//*(10*p.y);
float4 p_new = GetResultPixel(pID_new);
//if not empty - move horizontal
//若下一个像素不为空,那么将其随机水平位移
if(p_new.x > 0 || p_new.z > 0)
{
//这里_Time类似一个随机数种子
//sign函数将其约束到-1 至 1
direction = int2(sign(random(float2(pID) + _Time)-0.5f) , -1 );
pID_new = pID+direction;
p_new = GetResultPixel(pID_new);
}
//if empty - assign
//若为空则赋值
if(p_new.x == 0 && p_new.z == 0)
{
Result[pID_new] = p;
Result[pID] = float4(0,0,0,1);
}
}