计算着色器的动态输出
Dynamic output from compute shader
如果我在计算着色器中生成 0-12 个三角形,有没有办法可以将它们流式传输到缓冲区,然后用于渲染到屏幕?
我目前的策略是:
- 创建大小为
threads * 12
的 float3
缓冲区,以便可以存储最大可能的三角形数;
- 使用取决于网格中线程位置的索引写入缓冲区,因此不存在竞争条件。
如果我想从这里渲染,我需要跳过空内存。这听起来很难看,但目前可能没有其他办法。我知道 CUDA 几何着色器可以有可变长度输出,但我想知道 if/how iOS 上的游戏可以在 GPU 上生成可变长度数据。
更新 1:
我一写出这个问题,就想到了使用第二个缓冲区的可能性,它会指出每个块有多少个三角形可用。然后顶点着色器将处理该块的所有三角形的所有顶点。
虽然这不会解决未使用内存的问题,但由于我有大量线程,因此浪费的内存总量将相当可观。
您正在寻找的是 D3D 的“AppendStructuredBuffer”的 Metal 等价物。您想要一种可以自动添加结构的类型。
我不熟悉 Metal,但它确实支持 Atomic operations,例如 'Add',这就是您滚动自己的 Append Buffer 真正需要的。将计数器初始化为 0,让每个线程向计数器添加“1”,并使用原始值作为要写入缓冲区的索引。
如果我在计算着色器中生成 0-12 个三角形,有没有办法可以将它们流式传输到缓冲区,然后用于渲染到屏幕?
我目前的策略是:
- 创建大小为
threads * 12
的float3
缓冲区,以便可以存储最大可能的三角形数; - 使用取决于网格中线程位置的索引写入缓冲区,因此不存在竞争条件。
如果我想从这里渲染,我需要跳过空内存。这听起来很难看,但目前可能没有其他办法。我知道 CUDA 几何着色器可以有可变长度输出,但我想知道 if/how iOS 上的游戏可以在 GPU 上生成可变长度数据。
更新 1:
我一写出这个问题,就想到了使用第二个缓冲区的可能性,它会指出每个块有多少个三角形可用。然后顶点着色器将处理该块的所有三角形的所有顶点。
虽然这不会解决未使用内存的问题,但由于我有大量线程,因此浪费的内存总量将相当可观。
您正在寻找的是 D3D 的“AppendStructuredBuffer”的 Metal 等价物。您想要一种可以自动添加结构的类型。
我不熟悉 Metal,但它确实支持 Atomic operations,例如 'Add',这就是您滚动自己的 Append Buffer 真正需要的。将计数器初始化为 0,让每个线程向计数器添加“1”,并使用原始值作为要写入缓冲区的索引。