2011-03-14 32 views
3

我正在学习OpenGL,并与gluPerspective有问题。下面是我使用的代码中的init()如何增加openGL停止绘制对象的距离(zfar/gluPerspective)?

// 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); 

我的现场作品的权利..但只要我去一点点远离我的对象,他们dissapear(如图像的红球)。 :Frustrum example Web where I took graph from

我知道红球在视野之外,不会显示。所以我想要的是增加它停止绘制的距离。我试图增加3000.0f,但不工作!

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

所以我的问题是:我怎样才能提高距离openGL的地方停绘图对象?

有关该问题的一些图片: Pic1 Pic2

+0

我花了很多谷歌搜索,发现了很多信息(如http://webcache.googleusercontent.com/search?q=cache:-rnJ929O4dgJ:www.sjbaker.org/steve/omniv/love_your_z_buffer.html+ http://www.sjbaker.org/steve/omniv/love_your_z_buffer.html&cd=1&hl=zh-CN&ct=clnk&gl=uk&source=www.google.co.uk),但我不完全理解为什么不工作,我应该怎么做它。请记住我正在学习OpenGL。 – 2011-03-14 15:43:43

回答

4

我想通了,发生了什么事,所以我回答这个自己帮助其他人的未来:

更改zfar工作正常。我的问题是(不包括在简化问题中)是我的天空盒。 Skybox很小,隐藏着天空的物体。在图2中很容易看到!

所以,如果你有类似的问题,只需再次检查你的天空盒。如果这是一个zfar问题,应该 是黑色的,而不是有天空的纹理!

+3

只需绘制禁用深度写入的天空盒:glDepthMask(GL_FALSE); draw_skybox(); glDepthMask(GL_TRUE); – datenwolf 2011-03-14 17:08:35

+0

好点。没有看到链接的图片:) – Thomas 2011-03-14 17:25:45

+0

我在评论中添加了图片到你的答案,后来又添加到原来的问题! – 2011-03-14 18:01:12

3

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

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

为什么你首先需要那么大的观看距离?也许还有其他方法可以更好地满足您的需求。

+0

**物体尺寸**:我画了一个1.0f大小的大建筑物(吸引轮),然后我把它缩小到70.0f。 您可以在此处看到对象大小:http://i1188.photobucket.com/albums/z416/cad_vga/Attraction/Capt1.png 而我在这里遇到的问题是:http://i1188.photobucket.com/相册/ z416/cad_vga/Attraction/Capt2.png – 2011-03-14 16:46:50