2011-11-29 39 views
4

我目前正在開發我的第一款3D遊戲作爲學校項目,遊戲世界完全受到Minecraft(完全由立方體制成的世界)的啓發。我目前正試圖改善性能,試圖實現頂點緩衝區對象,但我卡住了,我已經實現了這種方法:Fr c剔除,只繪製暴露面和距離剔除,但我有以下疑問:使用Frustum Culling需要一些幫助來實現VBOs

  1. 我目前在我的世界中有大約2^24個立方體,分爲1024 * 16 * 64立方體塊,現在我正在進行即時模式渲染,如果我爲每個塊執行一個VBO, ,每次移動攝像機(更新平截頭體)時,是否必須更新該VBO?這是否有性能問題?

  2. 我可以動態更改每個VBO的大小嗎?或者我必須讓每一個都儘可能最大(大塊完全充滿物體)?

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

+0

這不是說這是StackOverflow的主題,但是您可能會在gamedev.stackexchange.com上找到更多具有OpenGL經驗和性能的代碼。 – Kylotan

+0

你是對的,我也會在那裏嘗試我的運氣。 – Isracg

回答

1
  1. 改變,每一次改變相機截時間VBO是不是可能是個好主意。連續緩衝數據的開銷可能會超過您通過繪製更少的多邊形所獲得的性能收益。如果整個維也納國際組織在完全脫離最後階段,你可能會更好地剔除。你最終會畫出更多的聚合物,而不是絕對必要的,但這將比平衡出來的事實是,從VBO繪圖比直接繪製模式快得多。
  2. 您可以更改VBO的大小,但只能通過對glBufferData執行新的調用,如果您要將數據發送到圖形卡,這可能是一個昂貴的通話。
  3. 你最好不要把所有的塊都保存在內存中,這會很快失去控制。記住你的周圍環境,當你離開時丟棄它們是你最好的選擇。
+0

到2 .:如果他確實每幀都更新整個VBO,他會(或應該)調用'glBufferData',所以他也可以放入不同的大小。如果他不更新VBO(就像你在1中所建議的那樣),他也不需要調整它。所以在這種情況下我沒有看到'glBufferData'的問題。 –

+0

我只是在談論改變VBO的大小,而不是專門針對他的情況。我的意圖是表明改變vbo的大小需要一個完全的拒絕,因此你不能輕易地在最後添加一些元素。 – nonVirtualThunk

+0

@nonVirtualThunk我還有一個問題,是否必須爲每個VBO中的每個頂點保留一個索引?似乎有點內存昂貴,因爲我有許多頂點。我不能只畫一個給定的VBO的所有頂點? – Isracg

1
  1. 先天真(不neccessarily在一個壞的意義上)的做法確實是更新VBO基礎上,視錐和隱藏面剔除結果每一幀。雖然這可能聽起來很邪惡,但請記住,使用即時模式實際上是同樣的事情(每幀將每個頂點發送到GPU),但有一百萬次驅動程序調用(不要低估一個glVertex),而不僅僅是幾個緩衝區函數,一次平局。

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

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

  2. 無論如何,由於您更新整個緩衝區的每一幀(因此應調用glBufferData),調整大小是絕對沒有問題的。請再次撥打glBufferData,並以不同的尺寸顯示。

  3. 這取決於你有多少個塊。但是如果它們的數量變大了,那麼一些緩存技術(刪除更遠的VBO,刪除距離,塊)可能是一個好主意。

+0

嘿,我的建議取得了很好的進展,我只有一個問題。我需要爲每個VBO中的每個頂點保留一個索引嗎? – Isracg