4

如果我在计算着色器中生成 0-12 个三角形,有没有办法可以将它们流式传输到缓冲区,然后用于渲染到屏幕?

我目前的策略是:

  • 创建一个float3大小为 的缓冲区threads * 12,因此可以存储最大可能数量的三角形;
  • 使用取决于网格中线程位置的索引写入缓冲区,因此没有竞争条件。

但是,如果我想从中进行渲染,则需要跳过empty memory。听起来很难看,但目前可能没有其他方法。我知道 CUDA 几何着色器可以具有可变长度输出,但我想知道 iOS 上的游戏是否/如何在 GPU 上生成可变长度数据。

更新 1

写完问题后,我就想到了使用第二个缓冲区的可能性,该缓冲区会指出每个有多少个三角形可用。然后顶点着色器将处理该块的所有三角形的所有顶点。

虽然这并不能解决未使用内存的问题,而且由于我有大量线程,所以浪费的总内存将是相当可观的。

4

1 回答 1

4

您正在寻找的是 D3D 的“ AppendStructuredBuffer ”的 Metal 等价物。您需要一种可以以原子方式添加结构的类型。

我不熟悉 Metal,但它确实支持诸如“添加”之类的原子操作,这是您滚动自己的附加缓冲区所真正需要的。将计数器初始化为 0,并让每个线程将“1”添加到计数器,并使用原始值作为要写入缓冲区的索引。

于 2015-08-16T10:37:02.650 回答