2011-06-09 80 views
2

我創建一個地形引擎,目前我一次上傳整個地形VB(頂點緩衝區)和IB(索引緩衝)的GPU,因爲地形不巨大。目前是256x256。上傳頂點和索引緩衝區到GPU

現在,讓我們說,我想創建一個使用Perlin雜點生成高度圖一個程序地形。我可以生成「補丁」並一次性向GPU上傳補丁的所有VB和IB,但是隨着玩家移動很遠並且必須生成新的補丁,那麼我將不得不生成新補丁並將其上傳到GPU。我在腦海中遇到的困惑或問題有:

  1. 將VB和IB上傳到GPU上是否緩慢?數據上傳到GPU時,玩家是否會注意到閃爍?

  2. 會表現更好,如果我上傳了補丁的VB和IB逐步向GPU,而不是所有的人都在一次?基本上我在問VB和IB的大小是否很重要。

任何關於這個概念的信息將不勝感激。

謝謝!

回答

2

通常你會在一些小補丁,這爲玩家一起移動,你會流分割的地形。在我的地形引擎中,我永遠不會將索引緩衝區放入緩衝區對象中,因爲LOD機制會不斷更改繪製哪些頂點以及繪製什麼順序以改善早期Z. 256×256是合理的補丁大小,尤其是在您使用像quadtrees結構。

所以你能做的就是爲裝9個地形補丁什麼的,在某種程度上選擇每個補丁的大小,即可見光範圍內左右結束,圍繞中心貼片邊界的地方。

| | 
---+---+--- 
    | C | 
---+---+--- 
    | | 

隨着玩家在C貼片中移動,能見度範圍確保他無法看超出加載區域。一旦玩家移動到另外一個補丁,環繞補丁從另一面,即

A | | 
---+---+--- 
B | X-> C 
---+---+--- 
C | | 

將重新映射磚A,B,C到

 | | A' 
    ---+---+--- 
     ->C | B' 
    ---+---+--- 
     | | C' 

其中A 'B',C '回收A,B,C的記憶,但用新內容填充它。由於玩家從遠端移動到新的C補丁中,即只能看到新補丁的較近部分,所以可以在幾幀中加載A',B',C'的內容。

要回答你的兩個問題:

  1. 上傳幾何實際上是一個相當快的過程,所以這是沒有顯示塞。您不會看到閃爍,因爲數據上傳在渲染幀之間發生,並且只有在數據更新之後,繪圖命令纔會開始。

  2. 您上傳東西的方式對渲染性能沒有影響。但是它對加載地圖本身需要多長時間有影響。如果你希望玩家能夠遍歷大型世界,而不需要煩人的加載階段,你需要按需上傳較小的補丁。

+0

令人驚訝的是,今晚我會做一些測試,看看它是如何發展的。感謝您提供非常詳細的答案。但是關於「自己加載地圖需要多長時間」,讓我們假設VB和IB已準備好上傳(緩存在vram上),上傳到GPU時VB和IB的大小不會有關係,if VB可能有1000x1000頂點的補丁,那麼我應該注意到快門,對吧?越少,上傳到GPU的速度越快? – raRaRa 2011-06-09 14:13:33

+0

@raRaRa:vram是什麼意思?顯卡上的RAM?那麼,這就是GPU RAM,這就是緩衝區對象的全部內容。如果它已經加載到系統RAM中:是的,這個值越大,上傳的時間就越長。但最終的重點是上傳的頂點總數,如果它們有很多小塊或大塊,它們沒有什麼大的區別。如果你渲染的場景需要所有的視覺細節,他們將全部以任何方式上傳,然後才能繪製任何內容。 – datenwolf 2011-06-09 14:37:04

+0

我的意思是系統內存。但是,是的,我也意味着逐漸上傳很多小塊,同時一次上傳所有小塊。 – raRaRa 2011-06-09 14:42:09