2015-11-08 22 views
3

我目前正在使用UBO在OpenGL 4.3中進行渲染,以將所有常量數據存儲在GPU上。 (材料描述,矩陣等)。 它的工作原理是UBO的小尺寸(在我的實現中爲64kB)迫使我無數次地切換緩衝區,減緩了渲染速度,我正在尋找類似的方法來存儲幾MB。SSBO作爲更大的UBO?

經過一番研究,我發現SSBO允許這樣做,但也有不需要的「特徵」:它們可以從着色器寫入,並且讀取速度可能較慢。

是否有比SSBO更好的解決方案來爲着色器提供大塊數據?我覺得我錯過了一些東西,爲什麼應該將UBO限制在幾kB,而存在能夠處理更多數據的更靈活的解決方案?如果着色器存儲緩衝區是我正在尋找的,有沒有辦法確保它們不被着色器修改?

+3

我認爲紋理對於在着色器中使用大量數據是很好的,但我不確定。如果您需要更高的精度,您可以使用整數或浮點紋理。 –

回答

7

UBO和SSBO從根本上代表了兩種不同的硬件。

着色器按組執行,以便每個着色器都以鎖步執行。每組着色器調用都可以訪問一塊內存。這個記憶是UBO代表的。它相對較小(以千字節爲單位),但訪問速度相當快。執行渲染操作時,來自UBO的數據將被複制到該着色器本地內存中。

SSBO表示全局內存。他們基本上是指針。這就是爲什麼他們通常沒有存儲限制(最低GL要求是16 兆字節字節,大多數實現返回一個數量在GPU的內存大小的順序)。

它們訪問速度較慢,但​​這種性能是因爲它們存在的位置和訪問方式,而不是因爲它們可能不是恆定的。全局內存是全局GPU內存而不是本地常量內存。

如果着色器需要訪問更多的數據,可以輕鬆適應其着色器本地內存,那麼它需要使用全局內存。即使您有辦法聲明SSBO爲「常量」,也無法解決此問題。