计算着色器到底是什么?

计算着色器到底是什么?

什么是计算着色器?

精炼问题:

我需要能够编写着色器,知道它是在 GPU 端处理还是需要在 CPU 端处理。例如,我想创建浮点图块(渲染后),但在渲染前它们被存储为 8 位整数。

计算着色器能让我做到这一点吗?还是我理解不正确……

上一个问题:

我看过一些讨论各种着色器的视频,其中提到了计算着色器,但我的问题比答案还多,我发现自己需要知道它们是否有能力:具体计算数据而不进行渲染?或者它们是否意味着获取数据、计算然后渲染?

另外,计算着色器是否可以成为多用途着色器,它可以计算特定数据(浮点数)然后渲染出数据?

我正在尝试编写一个遮挡系统,在其中我将其像八位字节/potree/trees/(2的幂的网格)一样平铺。并且我更愿意将数据保持在较小的8位或16位信息中,并让计算着色器动态计算它(但是它是十亿个或更多的点 - 如果可能的话,这样做是否有意义?)。

答案1

什么是计算着色器?

着色器实际上只是经过编译以在 GPU 上运行的程序。
或者换句话说,GPU 是专为运行“着色器”而设计的特殊 CPU。

着色器接收输入(来自 GPU 内存)并计算输出(到 GPU 内存)。例如,顶点着色器接收 3D 模型的顶点并运行程序以将模型的每个顶点操纵为新顶点。

不过,渲染 3D 场景并不是利用 GPU 处理能力的唯一方法。运行“计算着色器”时,你所做的与任何其他渲染着色器所做的基本相同:

  1. 上传一些数据。(例如纹理、网格、数据集)
  2. 运行程序来处理数据。
  3. 获取程序的输出。*

*渲染着色器不需要将其输出复制回系统内存,输出只需继续通过管道直到进入显示屏。

另外,计算着色器是否可以成为多用途着色器,它可以计算特定数据(浮点数)然后渲染出数据?

使用 GPU 计算 API(例如 CUDA 或 OpenCL)时,您通常会将程序的输出复制回系统内存,以便对计算结果进行处理。
但是,这些结果通常已经位于 GPU 内存的连续块中。这与 GPU 内存中的纹理几乎相同,因此完全可以将计算着色器的输出用作片段着色器的“纹理”,并将这些结果渲染到屏幕上。

相关内容