2016-12-24 140 views
2

我正在使用一個原子計數器,它有自己的緩衝區,我想在其他一些通道中清除該計數器。因此,將緩衝區作爲着色器存儲緩衝區進行綁定以清除它,然後在第二次使用它作爲原子計數器緩衝區時很好嗎?另外我想問一下,在同一着色器中是否可以同時使用與着色器存儲緩衝區和原子計數器緩衝區相同的緩衝區,比方說,開始時4個字節只用於原子計數器,而在同一緩衝區中是其他讀取/修改的數據。使用緩衝區作爲着色器存儲緩衝區,然後作爲原子計數器緩衝區是否好?

回答

2

您可以使用具有不同目標的相同緩衝區,但您必須自己管理對齊要求(所有參數爲glGet,其名稱中爲ALIGNMENT)。

然後,您可以使用InvalidateBufferSubData作爲性能提示(GPU不必保留將清除的內容)來使範圍無效,並使用ClearBufferSubData清除範圍。

爲了獲得更好的性能,我建議使用原子計數器的雙緩衝或三重緩衝,或任何經常清除或更新的數據。

+0

我不完全明白你的意思是雙重或三重緩衝的計數器。你的意思是使用例如2個緩衝區爲相同的計數器,這是連續的着色器調用交換?我不知道這應該如何提高性能,因爲我需要清除這兩個反正。你能告訴我,glClearBuffer調用與一個線程的頂點着色器相比效率如何,它只是清除4個字節? – FamZ

+2

@FamZ:「*你能告訴我glClearBuffer調用與一個線程的頂點着色器相比效率如何,它只是清除4個字節?」......什麼?想想看。其中之一是一個簡單的命令。另一個是調用*渲染過程*。即使GPU沒有專門用於寫入GPU內存的命令,但最糟糕的情況是GPU會調用計算着色器來進行寫入。哪個比你的VS例子更好*。 –

+1

@FamZ使用多個緩衝區意味着您可以在使用當前的計數器時清除下一個計數器。由於兩個計數器是相互獨立的,所以在執行操作之前,實施不必等待計數器被清除。 – pleluron