【问题标题】:How can I increase distance (zfar/gluPerspective) where openGL stops drawing objects?如何增加openGL停止绘制对象的距离(zfar/gluPerspective)?
【发布时间】:2011-07-15 03:02:17
【问题描述】:

我正在学习 OpenGL,但遇到了 gluPerspective 的问题。这是我在 Init() 中使用的代码

// Calculate The Aspect Ratio Of The Window
// The parameters are:
// (view angle, aspect ration of the width to the height, 
//  The closest distance to the camera before it clips, 
// FOV, Ratio,  The farthest distance before it stops drawing)
gluPerspective(45.0f,(GLfloat)width/(GLfloat)height, 0.5f, 3000.0f);

我的场景工作正常.. 但只要我稍微远离我的对象,它们就会消失(如图像中的红球)。 :Web where I took graph from

我了解红球不在视线范围内,不会显示。所以我想要的是增加它停止绘制的距离。我尝试增加 3000.0f 但不起作用!。

    gluPerspective(45.0f,(GLfloat)width/(GLfloat)height, 0.5f, 3000000.0f);

所以我的问题是:如何增加 openGL 停止绘制对象的距离?

关于问题的一些图片: Pic1 Pic2

【问题讨论】:

  • 我花了很多时间在谷歌上搜索,找到了很多信息(如webcache.googleusercontent.com/…),但我不完全理解为什么不工作以及我应该怎么做。请记住,我正在学习 OpenGL。

标签: opengl glut glu


【解决方案1】:

我弄清楚发生了什么,所以我自己回答这个问题以帮助将来的其他人:

更改 zfar 可以正常工作。我遇到的问题(不包括在简化问题中)是我的天空盒。 Skybox 很小,用天空遮住了物体。在 pic2 中很容易看到!

因此,如果您有类似的问题,请仔细检查您的天空盒。如果这是一个 zfar 问题,那么一切都应该 用黑色代替天空纹理!

【讨论】:

  • 只绘制禁用深度写入的天空盒:glDepthMask(GL_FALSE); draw_skybox(); glDepthMask(GL_TRUE);
  • 我在您的答案的评论中添加了图片,后来又将它们添加到原始问题中!
【解决方案2】:

near 和 far 值定义了深度缓冲区的精度。 near 和 far 之间的比率越高,您获得的深度缓冲区精度误差就越大。因此,您的深度缓冲区实际上可能允许绘制对象,但如果它们很小且彼此靠近,它们可能仍然不可见(被拒绝或被透支)。

如果从 3000.0f 增加到 10000.0f,它可能仍然有效。你的物体有多大?

为什么首先需要这么大的观看距离?也许还有其他方法更适合您的需求。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-15
  • 2013-05-01
  • 2013-12-22
  • 1970-01-01
相关资源
最近更新 更多