[英]Need some help implementing VBOs with Frustum Culling
我目前正在為學校項目開發我的第一個3D游戲,游戲世界完全受minecraft啟發(世界完全由立方體制成)。 我目前正在嘗試通過實現頂點緩沖區對象來尋求提高性能的方法,但是我被困住了,已經實現了以下方法:視錐剔除,僅繪制暴露的面部和距離剔除,但我有以下疑問:
我目前在世界上大約有2 ^ 24個多維數據集,分為1024個塊,每個塊有16 * 16 * 64個立方體,現在我正在執行即時模式渲染,如果我對每個塊實現一個VBO,則它適用於平截頭體剔除。每次移動攝像機時都必須更新該VBO(以更新視錐)嗎? 這對性能有影響嗎?
我可以動態更改每個VBO的大小嗎? 還是我必須使每一個都盡可能大(塊完全充滿對象)?
我是否必須將每個訪問的塊保留在內存中,還是可以有效地刪除該VBO並在需要時重新創建它。
glBufferData
進行新調用來glBufferData
,如果將數據發送到圖形卡,這可能是一個昂貴的調用。 第一種幼稚的方法(不一定是從某種意義上講不是很糟糕的方法)的確將是基於視錐和隱藏臉部剔除結果在每個幀上更新VBO。 盡管這聽起來可能很邪惡,但請記住,使用即時模式實際上是一回事(每幀將每個頂點發送到GPU),但是有上百萬個驅動程序調用(不要小看glVertex
),而不僅僅是幾個緩沖區函數和一次抽獎。
因此,使用GL_STREAM_DRAW
(當然使用GL_DYNAMIC_DRAW
或什至GL_STREAM_DRAW
)將仍然比立即模式更快。 不僅可能的GPU存儲,而且減少的驅動程序調用數量使VBO(通常是頂點陣列)比即時模式更快。
稍后,您還可以使用轉換反饋來實現一些更復雜的硬件剔除技術,因此您可以直接在GPU上剔除,而不必在每個幀中將頂點數據發送到GPU。
由於無論如何都要更新整個緩沖區的每一幀(因此應該調用glBufferData
),因此調整大小絕對沒有問題。 只需再次調用glBufferData
。
這取決於您有多少塊。 但是,如果它們的數量增加,則一些緩存技術(刪除距離更遠的VBO,距離被淘汰,塊)可能是個好主意。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.