除了使用多個幀緩衝區對象,我還可以只創建一個,並在需要時通過切換目標紋理來實現相同的結果?OpenGL:只使用一個幀緩衝區和切換目標紋理
- 在所有情況下,這是一個壞主意嗎?如果是,爲什麼?
我一直在我的程序的API中實現一個函數render.SetTargetTexture()
,邏輯上它不會工作,如果在幕後使用更多的幀緩衝區。我必須完全暴露幀緩衝區。
除了使用多個幀緩衝區對象,我還可以只創建一個,並在需要時通過切換目標紋理來實現相同的結果?OpenGL:只使用一個幀緩衝區和切換目標紋理
我一直在我的程序的API中實現一個函數render.SetTargetTexture()
,邏輯上它不會工作,如果在幕後使用更多的幀緩衝區。我必須完全暴露幀緩衝區。
一個FBO本身只是一些邏輯構造,由實現維護,它將只消耗其參數需要的小內存。 FBO的主要目的是讓一個對象保持一致的狀態。
每當您對FBO的結構進行更改時,實施必須檢查其有效性和完整性。 OpenGL規範並沒有說明這個操作的複雜性,但可以肯定的是,假設FBO的結構變化是最耗時的操作(可能會有很大的空間)。由於FBO本身並不消耗值得注意的內存,因此只有附件佔用獨立對象的內存,分配多個FBO並打開這些是我推薦的內存。
由於人們的理由,切換幀緩衝器通常更快。根據我的經驗,在將不同紋理類型附加到fbos(2D紋理到fbo,之前附加了1D紋理,因此附加到fbo的第一個紋理設置某種目標狀態,以後不能更改)時也會出現問題。我使用的解決方案是每個目標類型都有一個fbo。 NVidia Quadro設備出現此錯誤,不確定它是否是驅動程序問題。
我從來沒有真正做過基準測試,但看起來有點確定,綁定不同的FBO更有效率。爲FBO綁定不同的紋理需要對幀緩衝完整性進行復雜的一致性檢查(如果不是您明確的話,那麼在任何情況下都需要在驅動程序內部)。綁定一個不同的,未經修改的幀緩衝區並不需要這樣的事情。 – Damon
我認爲另一種看待它的方式是**它可能並不重要**。我不知道任何應用程序每幀切換目標數千次。大多數切換最多隻有幾次。我同意切換fbos應該比切換附件更快,但如果它真的沒有問題比你的API好。 – gman