10

我知道通过在 OpenGL ES 中设置深度函数,可以控制重叠几何图形在 3D 场景中的渲染方式。我在我的代码中使用gl.depthFunc(gl.LEQUAL)(webgl)。

然而,当两组多边形重合并且颜色不同时,生成的表面会变成两种颜色的任意混合图案(随着相机位置的变化而变化,因此会导致闪烁)。看看这张图片:

在此处输入图像描述

我怎样才能解决这个问题?我尝试了不同的 depthFunc 值,但没有一个能解决这个问题。我希望重合的多边形具有单一颜色,无论哪种颜色都没有关系。

4

4 回答 4

12

这称为z-fighting,并且与在相同深度渲染的两个对象有关,但舍入误差(和深度缓冲区精度)偶尔会在另一个之前弹出一个。您可以使用的一种解决方案是使用 glPolygonOffset 函数:

http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPolygonOffset.xml

您可以在本页底部看到它的使用示例:

http://www.glprogramming.com/red/chapter06.html

于 2011-10-20T13:22:00.613 回答
3

你所经历的被称为Z 战斗,不幸的是没有明确的解决方案。发生的情况是,由于深度缓冲区的精度有限,会出现舍入误差,并且任一原语“赢得”深度测试操作。更改深度功能只会切换战斗模式中的颜色,但不会删除它。

摆脱 Z 战斗的一种方法是使用多边形偏移http://www.opengl.org/wiki/Basics_Of_Polygon_Offset

不幸的是,多边形偏移引入了它自己的问题。

于 2011-10-20T13:16:16.683 回答
2

尝试在调用 gluPerspective 时将 z-near 更改为远离零:

void gluPerspective(
    GLdouble    fovy,
    GLdouble    aspect,
    GLdouble    zNear,
    GLdouble    zFar);

从这个网站: http ://www.opengl.org/resources/faq/technical/depthbuffer.htm

深度缓冲似乎有效,但多边形似乎会流过它们前面的多边形。这是怎么回事?

您可能以严重限制深度缓冲区精度的方式配置了 zNear 和 zFar 剪裁平面。通常,这是由过于接近 0.0 的 zNear 剪裁平面值引起的。随着 zNear 裁剪平面越来越接近 0.0,深度缓冲区的有效精度急剧下降。将 zFar 剪裁平面移离眼睛更远总是会对深度缓冲区精度产生负面影响,但它并不像移动 zNear 剪裁平面那样剧烈。

于 2011-10-20T13:20:42.247 回答
0

尝试弄乱glPolygonOffset(factor, units). 此页面可能会有所帮助。

于 2011-10-20T13:15:33.927 回答