2013-12-20 94 views
1

我有一個程序,我使用着色器程序來渲染附加到FBO的紋理,然後更改程序的參數(通過更改制服的值)並渲染到第二個紋理附加到FBO。這兩個渲染圖像然後用於生成第三個。OpenGL命令的執行順序

我不確定我得到的結果是否正確。我知道GPU可以自由選擇執行OpenGL命令的時間。但是,只要執行順序遵循代碼中出現的命令的順序,那應該不是問題。這是真的嗎?

後續問題。我需要將生成的幀保存到磁盤。我知道如何。但是我需要確保GPU在完成渲染之前完成渲染。我該如何執行?

+0

如果您從未試圖從您繪製的相同紋理中進行採樣(這將創建反饋循環),這將起作用。一般來說,你所描述的並不是問題,一些更新的東西被引入到GL4中,比如圖像加載/存儲,它會把很多東西都拋在腦後,但是你應該假裝我從來沒有提到過,並且避免在天空下跌時驚慌失措: ) –

+0

@ AndonM.Coleman謝謝Ando。這正是我不確定的。我遵循的步驟是我在user1781290答案的評論中提到的步驟。繪製前兩個紋理時使用一個着色器程序,第二個着色器程序繪製第三個紋理。在任何時候,只有一個FBO。我只是在每個階段改變附着的紋理。我也嘗試添加'glFinish()',但我仍然在我對user1781290的答案的第二條評論中提到了這個不匹配問題。 – informer2000

回答

1

OpenGL將按照它們發出的順序執行命令(或至少模擬此行爲)。這意味着,一個接一個地使用2個不同的FBO是沒有問題的。此外,這意味着OpenGL將確保在您從FBO獲得結果時您的渲染完成。

您可以調用glFinish()讓程序等待,直到所有待處理的OpenGL命令都被管道處理完畢,但在幾乎所有情況下這都是不必要的。

+0

我沒有用2個FBO。但是我將一個紋理附加到FBO,調用glDraw渲染到該紋理,附加另一個紋理,並再次調用glDraw渲染到第二個紋理。然後,我將第三個紋理添加到FBO,並使用前兩個紋理中的樣本渲染最終結果。那個序列會起作用嗎? – informer2000

+0

我認爲出現問題的原因是我生成的幀來自輸入視頻幀。我將幀讀入幀緩衝區,然後逐個對緩衝幀進行處理。但是,當我查看我保存的輸出幀時,似乎存在不匹配(即,輸出中的幀300與輸入中的幀300不對應,而是與之後的幾幀相對應)。 – informer2000

+0

謝謝。接受答案。原來,這是我用於緩衝解碼幀的代碼中的一個錯誤。 – informer2000

相關問題