我正在寫一個飛行模擬器,並陷入了這個流派的經典問題:視錐體的近平面必須足夠近以使飛機駕駛艙可見,遠平面必須遠離以啓用可見距離長達40公里。如何擺脫OpenGL中的z戰鬥問題?
能見度距離或近/遠比例的確超出了opengl的z緩衝精度能力,而遠處的物體閃爍劇烈。這是一個花哨的3D引擎讓你獨自解決問題的地方,你需要真正的opengl知識:)。也許我找到了解決問題的正確方法(如果我錯了,OpenGL專家會糾正我),但是我的解決方案忽略了重要的一點。改變渲染器進行雙通道渲染:
-
在第一遍遠處的物體
- 和背景必須顯示,近平面搬走,Z緩衝是幸福的,地形看起來不錯,但近對象剪裁掉。
- 在第二階段中,投影矩陣會針對近距離物體進行調整,並應顯示駕駛艙。
的未解決的問題:在第二遍所有遠處的物體和背景是不可見的,因此我有駕駛艙和它後面的黑色背景。第二輪的結果完全浪費了第一輪的結果。埃爾戈計劃重疊不會發生。問題: 如何強制opengl在第二遍中忽略背景顏色,這樣兩個通過結果都會創建所需的疊加?
P.S.這是現狀的圖像(近/遠飛機處於極端狀態,使所有細節都可見,單程無投影調整)。
http://www.flickr.com/photos/[email protected]/5995604542/sizes/l/in/photostream/
的緩衝器清除每渲染週期和只發生一次,而不是所涉及的2遍之間。這裏,清除碼:
JoglContext jctx = (JoglContext) ctx;
GLContext context = context(ctx);
GL gl = context.getGL();
// Mask of which buffers to clear, this always includes color & depth
int clearMask = GL.GL_DEPTH_BUFFER_BIT | GL.GL_COLOR_BUFFER_BIT;
gl.glPushAttrib(GL.GL_DEPTH_BUFFER_BIT);
gl.glDepthMask(true);
gl.glClearColor(r, g, b, jctx.getAlphaClearValue());
gl.glClear(clearMask);
gl.glPopAttrib();
您所描述的方法也用在2次:1。「長途」投影和地形2「短距離」和駕駛艙之間沒有信息交換,但是第二後傳遞駕駛艙後面的背景是黑色的。也許glDepthRange功能幫助,必須檢查手冊。
zbuffer深度是24位。
感謝您的及時響應,Nicol。我的評論過於冗長,不得不粘貼到原文中。請仔細看看glDepthRange。 – Paul