2015-10-05 71 views
0

我在地形上遇到了一個問題,它現在只是一個帶有透明藍色的四邊形。地形在水中閃爍|深度緩衝精度問題?

當關閉了它,它看起來像這樣: enter image description here

正如你所看到的,這是很簡單的 - 代表水的平透明四。

然而,當我漸行漸遠,出現這種情況: enter image description here

對於那些誰也看不出的GIF,或需要一個external link(或不明白這是怎麼回事),地勢毛刺在水面上。如果你在靠近水的地方看近處,你會看到地形在它上面/下面發生抖動。

這裏就是我準備的3D視圖代碼:

static void ready3D() 
{ 
    glViewport(0, 0, Display.getWidth(),Display.getHeight()); 
    glMatrixMode(GL_PROJECTION); 

    glLoadIdentity(); 
    GLU.gluPerspective(45, (float) Display.getWidth()/Display.getHeight(), 50f, 500f); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    glDepthFunc(GL_LEQUAL); 
    glEnable(GL_DEPTH_TEST); 
} 

有誰知道問題是什麼,我怎麼能提高深度緩衝的精確度(假設深度緩衝的問題) ?

+0

向我們提供第二個GIF的外部URL,但它不嵌入帖子中。 – Xirema

回答

1

增加深度緩衝不會有很大的幫助爲具有開放的世界導致從zNear到zFar映射到你的深度緩存大的距離。常見的技巧之一是執行logarithmic depth buffer。這使您有能力強調您需要的細節,但在目前的情況下,這需要隨着您的車輛+攝像機系統的高度而改變。所以對數緩衝區不是一個解決方案,增加「線性」緩衝區不會影響很多。我建議閱讀thisthis有關深度緩衝區的精彩文章。

第二點是,你的風景似乎程序產生的。如果是這樣,頂點可以產生真正接近水面高度。在這種浮點比較戰爭中贏得勝利並不簡單,只需進行深度緩衝操作(如果可能的話)。

第三點是,一般來說,你不希望額外的運行時間的工作,這就是模板緩衝區使用在這裏是有問題的原因(正如JPhi1618注意到的)。

所以,如果你有機會從我的角度來看修改的景觀生成算法是很值得的。來自JPhi1618的話再說一遍:

如果Y比水的水平還要小一點,就比水少一點。

2

這很難從GIF說,但有什麼我收集的是,您遇到的Z-Fighting一個實例。

有幾種解決方案,往往是最有效的對付Z-格鬥:

  • 增加的Z緩衝區的分辨率。
  • 調整水的相對位置以進一步分離它們,從而減少兩個幾何圖形碰撞的機會
  • 利用模板緩衝區確保對象繪製正確。

我也看到了在處理某些對象時嘗試禁用深度測試的解決方案,但這些解決方案几乎從來都不是很好的解決方案。

+1

是的,它看起來像z戰鬥。假設景觀生成程序上,我認爲提高你的生成算法,所以高度值不是太接近飛機是最適用的解決方案。只要飛機可以改變高度並具有很好的視野,z-緩衝區的分辨率或使用對數z-緩衝區似乎不是一個好的選擇。不能說關於模板緩衝區。 – mlkn

+0

@mlkn您能否介紹一下更改Z-Buffer分辨率的優缺點,以及爲什麼我四處移動會導致問題?這似乎是最簡單的解決方案,但我對它並不瞭解,也不知道如何實際執行它。 – Joehot200

+1

+1,用於更改地形生成方式的選項。這是「免費的」,不會增加任何使用模板緩衝區的計算複雜性。當生成地形時,它不會更多地使用'if(y <0)y = -100;'換句話說,如果Y比水的水平稍微小一點,使它小於水。 – JPhi1618