最近我注意到glCopyBufferSubData不適用於Shader存儲緩衝區對象,因爲擴展名不包括提及它。爲了確保,我通過打印出映射的緩衝區來測試它,並且新的SSBO包含了重複的廢話,表明這種情況。無需創建自定義計算着色器來執行此操作,是否有任何方法可以從CPU發出的命令中複製GPU上的數據,類似於glCopyBufferSubData對其他緩衝區類型所做的操作?將SSBO複製到另一個SSBO中
0
A
回答
3
函數glCopyBufferSubData
適用於緩衝區對象。緩衝對象本身沒什麼特別的,所有的緩衝對象都是一樣的。僅當將緩衝區對象綁定爲着色器存儲緩衝區時,纔將其用作着色器存儲緩衝區。但是如果不用作着色器存儲緩衝區,它只是一個普通的緩衝區對象。所以你假設glCopyBufferSubData
不能在着色器存儲緩衝區上工作,這顯然是錯誤的,它在緩衝區上工作,不管你以後使用那些緩衝區。擴展沒有提到SSBO的唯一原因是,當引入copy_buffer擴展時SSBO不存在,但是這個功能與SSBO完全正交。
它不適用於你的原因是在其他地方搜索。也許你不能使用GL_SHADER_STORAGE_BUFFER
作爲glCopyBufferSubData
的有效目標,但這並不是必需的,只需將緩衝區綁定到另一個目標上即可。 GL_COPY_READ_BUFFER
或GL_COPY_WRITE_BUFFER
。另一個錯誤來源可能是,從着色器寫入SSBO不一定與以下讀取操作同步,如果在計算完數據後立即複製數據,則可能需要額外的glMemoryBarrier
。
但要說清楚,glCopyBufferSubData
適用於任何類型的緩衝區,並且綁定緩衝區的目標完全不與緩衝區對象及其數據本身綁定。您可以完美地使用SSBO來計算一些數據,然後將其渲染爲VBO等等。
相關問題
- 1. 從SSBO讀取rgba8
- 2. SSBO作爲更大的UBO?
- 3. OpenGL計算着色器SSBO
- 4. 使用SSBO作爲VBO輸入下一個繪製調用
- 5. OpenGL片段着色器不寫入SSBO
- 6. 將一個NSString複製到另一個
- 7. 將一個plist複製到另一個
- 8. 將TextureView複製到另一箇中
- 9. 將CGContext複製到另一個CGContext
- 10. 將docx複製到另一個末尾
- 11. 將數據複製到另一個表
- 12. 將圖形(adjacency_list)複製到另一個
- 13. 將行從表複製到另一個
- 14. 將CharArrayBuffer複製到另一個CharArrayBuffer
- 15. 將iframe複製到另一個用戶
- 16. 將元素類複製到另一個
- 17. 將XtraTreeList複製到另一個treelist
- 18. 將值複製到另一個表
- 19. 將結構複製到另一個
- 20. 將一個表中的行復制到另一個SQL中
- 21. 將另一個鋸齒狀陣列複製到另一個
- 22. 複製到另一個
- 23. 如何使用comptu着色器(ssbo)在一個緩衝區中使用兩個數組?
- 24. 將數據從一個AudioSampleBuffer複製到另一個類中的另一個
- 25. 將一個Xml文檔內容複製到另一個C#中
- 26. 如何將一個畫布複製到另一個畫布中?
- 27. 將SQL中的值從一個表複製到另一個表
- 28. 將兩列複製到另一個表中,一個是主鍵
- 29. 在sqlite3中:將列從一個表複製到另一個表
- 30. 將一個矩陣複製到另一個列中
謝謝你的澄清和進一步的方向。 – Behemyth