光线追踪--computer shader 输入参数

参考:https://zhuanlan.zhihu.com/p/135144894

GPU以“工作组“”的方式调用shader,每个工作组是三维的(以方便一维、二维图形、三维粒子等多种场景下的计算);

  1. in uvec3 gl_NumWorkGroups;
    分别保存x, y, z方向上的工作组最大个数;

  2. in uvec3 gl_WorkGroupSize
    每个工作组在x, y, z方向上的大小;
    通过 gl_NumWorkGroups和gl_WorkGroupSize可以计算出总共有多少次单独的着色器调用(注:不是有多少个GPU 线程Core,而是调用次数)= (Groups.x * Size.x) * (Groups.y * Size.y) * (Groups.z * Size.z)

  3. in uvec3 gl_WorkGroupID;
    当前工作组在全局工作组中的索引ID;

  4. in uvec3 gl_LocalInvocationID;
    本地工作组中的shader调用的索引,显然其x, y, z取值范围不会超过gl_WorkGroupSize.x y z;

5. in uvec3 gl_GlobalInvocationID;
当前全局调用的索引值,不过它是三维的,需要做扁平化才能作为一个一维索引(比如在1SPP的情况下,该一维索引可以作为Ray-Id);

gl_GlobalInvocationID = gl_WorkGroupID * gl_WorkGroupSize + gl_LocalInvocationID;
若z为0,则二维扁平化后:gl_Index = gl_GlobalInvocationID.y * gl_NumWorkGroups.x * gl_WorkGroupSize.x + gl_GlobalInvocationID.x;

  1. in uint gl_LocalInvocationIndex;
    扁平化版本的gl_GlobalInvocationID,其计算方式如下:
    gl_LocalInvocationIndex = gl_LocalInvocationID.z * gl_WorkGroupSize.x * gl_WorkGroupSize.y + gl_LocalInvocationID.y * gl_WorkGroupSize.x +gl_LocalInvocationID.x;
    注:当gl_NumWorkGroups为1时(此时gl_WorkGroupID为0),gl_LocalInvocationIndex才是全局唯一的;所以实际调试时常常见gl_NumWorkGroups设为1以方便计算。

如果gl_NumWorkGroups不是1,则全局唯一的index计算方式应该如下:
uvec3 uvw = gl_WorkGroupID.xyz * gl_WorkGroupSize.xyz + gl_LocalInvocationID.xyz;
uint gl_Index = uvw.z * gl_NumWorkGroups.x * gl_WorkGroupSize.x * gl_NumWorkGroups.y * gl_WorkGroupSize.y + uvw.y * gl_NumWorkGroups.x * gl_WorkGroupSize.x + uvw.x;

  1. 每个group的size是在computer shader中定义的,比如:
    layout (local_size_x = 16, local_size_y = 16) in;
    groupCount则是在vkCmdDispatch命令中配置;

  2. 如何设置参数groupCount和local_size的参数?
    对于二维图片,其height和width必须是groupCount * local_size的整数倍,而且groupCount * local_size不能太小,否则Computer shader的计算性能会下降;

    参考:https://blog.csdn.net/koibiki/article/details/80590885

你可能感兴趣的:(光线追踪--computer shader 输入参数)