我正在写一个飞行模拟器,并陷入了这个流派的经典问题:视锥体的近平面必须足够近以使飞机驾驶舱可见,远平面必须远离以启用可见距离长达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