2013-11-25 42 views
0

最近我注意到glCopyBufferSubData不適用於Shader存儲緩衝區對象,因爲擴展名不包括提及它。爲了確保,我通過打印出映射的緩衝區來測試它,並且新的SSBO包含了重複的廢話,表明這種情況。無需創建自定義計算着色器來執行此操作,是否有任何方法可以從CPU發出的命令中複製GPU上的數據,類似於glCopyBufferSubData對其他緩衝區類型所做的操作?將SSBO複製到另一個SSBO中

回答

3

函數glCopyBufferSubData適用於緩衝區對象。緩衝對象本身沒什麼特別的,所有的緩衝對象都是一樣的。僅當將緩衝區對象綁定爲着色器存儲緩衝區時,纔將其用作着色器存儲緩衝區。但是如果不用作着色器存儲緩衝區,它只是一個普通的緩衝區對象。所以你假設glCopyBufferSubData不能在着色器存儲緩衝區上工作,這顯然是錯誤的,它在緩衝區上工作,不管你以後使用那些緩衝區。擴展沒有提到SSBO的唯一原因是,當引入copy_buffer擴展時SSBO不存在,但是這個功能與SSBO完全正交。

它不適用於你的原因是在其他地方搜索。也許你不能使用GL_SHADER_STORAGE_BUFFER作爲glCopyBufferSubData的有效目標,但這並不是必需的,只需將緩衝區綁定到另一個目標上即可。 GL_COPY_READ_BUFFERGL_COPY_WRITE_BUFFER。另一個錯誤來源可能是,從着色器寫入SSBO不一定與以下讀取操作同步,如果在計算完數據後立即複製數據,則可能需要額外的glMemoryBarrier

但要說清楚,glCopyBufferSubData適用於任何類型的緩衝區,並且綁定緩衝區的目標完全不與緩衝區對象及其數據本身綁定。您可以完美地使用SSBO來計算一些數據,然後將其渲染爲VBO等等。

+0

謝謝你的澄清和進一步的方向。 – Behemyth