一些背景: 我正在使用 C# 和 HLSL。 我有一个程序将一些 3d 数据存储在 GPU 上的两个缓冲区中。这包含位置 (float3) 和图层信息 (int)。
因此,这些点通过它们的位置进行描述,并且对于每个点,也存储在一个 int 值中的层信息(32 层,其中只有 2 层实际使用)。
int值的第一层/第一位基本上意味着该点是否被渲染,而第二个意味着它是否被选择(我的问题的重要部分)。
我基本上想获取所有选定的点(第二层设置为真)并将它们保存在其他地方。这让我想到一些问题:
将 GPU 上的点分开,然后将数据传输到 CPU 将字节值转换为浮点数并保存它们是否有意义?
到目前为止,我做了以下操作:我通过一些计算着色器调用计算了选定点的数量。我使用此信息创建一个新缓冲区,我只想在其中存储选定的点。下一个问题来了。如果我在计算着色器中执行此操作,我需要知道每个线程写入此缓冲区的点数,但我不知道,对吗?或者我可以在每次线程找到选定点时以某种方式写入缓冲区中的下一个未占用字段吗?
或者您会建议一种完全不同的方法吗?
我希望我能以一种可以理解的方式描述我的问题。
您可以使用AppendStructuredBuffer,它的工作原理类似于堆栈。 您还可以将其绑定为着色器中的普通缓冲区并按索引读取它。