[toc]

# 前言

最近项目中也有在做 GpuInstance 相关的东西,考虑到这节课讲的也是 GpuInstance, 故做此 Blog 当做笔记.

# 1. Compute Shader

基于 ComputeShader 实现的方案常见的有 GPGPU ,MaxWell 也有发过一篇文章,大概意思是 GPGPU 可能在将来会类似于现在的前端开发

Shader 在渲染管线中是用作可定制化部分的脚本而存在的,在常见的渲染管线中存在几何、顶点、片元等着色器。
但是考虑这一点,因为 GPU 极其适合大量同质化的并行运算,如果只能用在渲染管线中可能会导致无法轻量化的让游戏开发者利用 GPU 并发友好的这一特性。
基于此,微软在 DX11 中加入了 ComputeShader 这一 API。

同样,我们可以在 RenderDOC 中找到这一阶段

观察上图,左边代表的是一个较为完整的光栅化渲染流水线
而右边则只有一个 CS , 即 ComputeShader
可以发现,其实计算着色器本质上是脱离了渲染流水线的一个 运算脚本

# ComputeShader 分配线程组、线程

–todo: 详细基础需要查看 DirectX12 那本书来补充

在上图中,首先 CS 需要我们先在 CPU 端分配一个 线程组 ,以及指定 每个线程组执行的ComputeShader布局 其中 kernal 代表的是 ComputeShader 的入口函数名,5 代表的是每个线程组的线程子组有多少列,3 代表的是每个线程组的子组有多少行,2 代表的是有多少个线程组.
对于线程组内的每个子组而言,还会继续划分为每个子组有多少个线程,而子组内线程的布局则由 ComputeSahder 来指定 可以发现,线程子组其实也被划分为了三维的线程组,但是自组内的每块则是一个实际的线程
而指定子组线程布局的方式则是在入口函数前标记: [numthreads(10,8,3)] 实际的计算则在 CSMain 中.