我想將值列表發送到片段著色器中。它可能是一個很大的列表(長數千個項目)單精度浮點數。片段著色器需要對該列表進行隨機訪問,我想刷新每幀上CPU的值。我在考慮我如何可以這樣做選擇:作為數組類型的統一變量(“ uniform float x [10];”)。但是這里似乎有限制,在我的GPU上發送數百個值非常慢,而且當我想在運行時更改它時,我必須在著色器中硬編碼上限。正如高度1和我的列表的寬度的紋理,然后利用glCopyTexSubImage2D刷新數據。其他方法?我最近還沒有跟上GL規范的所有變化,也許還有其他專門為此目的設計的方法?
3 回答

白豬掌柜的
TA貢獻1893條經驗 獲得超10個贊
這聽起來像是紋理緩沖區對象的一個很好的用例。這些沒有太多做定期的紋理,基本上允許您在著色器訪問一個緩沖對象的內存作為一個簡單的線性陣列。它們類似于1D紋理,但不進行過濾,只能由整數索引訪問,這聽起來像您將其稱為值列表時需要執行的操作。而且它們還支持比1D紋理更大的尺寸。要更新它,你可以再使用標準緩沖對象的方法(glBufferData,glMapBuffer,...)。
但另一方面,我認為它們需要使用GL3 / DX10硬件,甚至已經成為OpenGL 3.1的核心。如果您的硬件/驅動程序不支持它,那么您的第二種解決方案將是選擇的方法,而是使用1D紋理而不是寬度x 1 2D紋理)。在這種情況下,你也可以使用非平面2D紋理和一些指數魔比最大紋理尺寸的支持列表。
但是,我認為紋理緩沖區是您問題的完美選擇。為了獲得更準確的了解,您還可以查看相應的擴展規范。
編輯:為了回應Nicol關于統一緩沖區對象的評論,您還可以在此處查找兩者的一些比較。我仍然傾向于使用TBO,但是不能真正地說明原因,僅是因為我認為它在概念上更合適。但是,也許尼克爾可以提供答案,使人們對該事件有更多的了解。
- 3 回答
- 0 關注
- 494 瀏覽
添加回答
舉報
0/150
提交
取消