簡體   English   中英

需要一些幫助來實現使用視錐剔除的VBO

[英]Need some help implementing VBOs with Frustum Culling

我目前正在為學校項目開發我的第一個3D游戲,游戲世界完全受minecraft啟發(世界完全由立方體制成)。 我目前正在嘗試通過實現頂點緩沖區對象來尋求提高性能的方法,但是我被困住了,已經實現了以下方法:視錐剔除,僅繪制暴露的面部和距離剔除,但我有以下疑問:

  1. 我目前在世界上大約有2 ^ 24個多維數據集,分為1024個塊,每個塊有16 * 16 * 64個立方體,現在我正在執行即時模式渲染,如果我對每個塊實現一個VBO,則它適用於平截頭體剔除。每次移動攝像機時都必須更新該VBO(以更新視錐)嗎? 這對性能有影響嗎?

  2. 我可以動態更改每個VBO的大小嗎? 還是我必須使每一個都盡可能大(塊完全充滿對象)?

  3. 我是否必須將每個訪問的塊保留在內存中,還是可以有效地刪除該VBO並在需要時重新創建它。

  1. 每次更改攝像機的視錐范圍時,都要更改VBO並不是一個好主意。 連續緩沖數據所產生的開銷可能會超過繪制較少的多邊形所獲得的任何性能提升。 當將整個VBO完全移出平整狀態時,最好剔除它們。 您最終將繪制出比嚴格需要更多的多邊形,但是,從VBO進行繪制比在即時模式下進行繪制要快得多,這將大大抵消這一事實。
  2. 您可以更改VBO的大小,但是只能通過對glBufferData進行新調用來glBufferData ,如果將數據發送到圖形卡,這可能是一個昂貴的調用。
  3. 最好不要將已創建VBO的所有塊都保留在內存中,這將很快失去控制。 最好將周圍的環境保存在內存中,並在離開時丟棄它們。
  1. 第一種幼稚的方法(不一定是從某種意義上講不是很糟糕的方法)的確將是基於視錐和隱藏臉部剔除結果在每個幀上更新VBO。 盡管這聽起來可能很邪惡,但請記住,使用即時模式實際上是一回事(每幀將每個頂點發送到GPU),但是有上百萬個驅動程序調用(不要小看glVertex ),而不僅僅是幾個緩沖區函數和一次抽獎。

    因此,使用GL_STREAM_DRAW (當然使用GL_DYNAMIC_DRAW或什至GL_STREAM_DRAW )將仍然比立即模式更快。 不僅可能的GPU存儲,而且減少的驅動程序調用數量使VBO(通常是頂點陣列)比即時模式更快。

    稍后,您還可以使用轉換反饋來實現一些更復雜的硬件剔除技術,因此您可以直接在GPU上剔除,而不必在每個幀中將頂點數據發送到GPU。

  2. 由於無論如何都要更新整個緩沖區的每一幀(因此應該調用glBufferData ),因此調整大小絕對沒有問題。 只需再次調用glBufferData

  3. 這取決於您有多少塊。 但是,如果它們的數量增加,則一些緩存技術(刪除距離更遠的VBO,距離被淘汰,塊)可能是個好主意。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM