2015-08-16 24 views
2

如果我在計算着色器中生成0-12個三角形,有沒有辦法將它們流式傳輸到一個緩衝區,然後將其用於渲染屏幕?來自計算着色器的動態輸出

我目前的策略是:

  • 創建的尺寸threads * 12float3一個緩衝器,因此可以存儲三角形的最大可能的數目;
  • 使用取決於網格中線程位置的索引寫入緩衝區,因此沒有競爭條件。

如果我想從這個渲染雖然,我將需要跳過空內存​​。這聽起來很難看,但目前可能沒有其他辦法。我知道CUDA幾何着色器可以具有可變長度輸出,但我不知道iOS上的遊戲是否可以在GPU上生成可變長度的數據。

更新1

只要我寫的問題,我想過使用第二緩衝區會指出有多少個三角形可用於每個的可能性。頂點着色器然後將處理該塊的所有三角形的所有頂點。

雖然這不會解決未使用的內存問題,並且由於線程數很多,浪費的內存總量也會相當大。

回答

3

你在找什麼是D3D的「AppendStructuredBuffer」的金屬等價物。你想要一個可以自動添加結構的類型。

我對金屬不熟悉,但它確實支持Atomic operations,比如'添加',這是您真正需要的自己的追加緩衝區。將計數器初始化爲0,並讓每個線程向計數器添加「1」,並使用原始值作爲要寫入緩衝區的索引。

+0

這正是我想到的:原子增加計數器以保留緩衝區的特定區域,然後寫入緩衝區。在傳遞結束時,使用原子int大小複製緩衝區來渲染緩衝區並刪除工作緩衝區。 – aledalgrande