Opengl es 如何在OpenGL(ES)中正确渲染重合多边形

Opengl es 如何在OpenGL(ES)中正确渲染重合多边形,opengl-es,webgl,depth-buffer,Opengl Es,Webgl,Depth Buffer,我知道,通过在OpenGL ES中设置深度函数,可以控制在3D场景中如何渲染重叠的几何体。我在代码中使用gl.depthFunc(gl.LEQUAL)(webgl) 但是,当两组多边形重合且颜色不同时,生成的曲面将变成两种颜色的任意混合图案(随着摄影机位置的变化而变化,从而导致闪烁)。请看这张图片: 我怎样才能解决这个问题?我尝试了不同的depthFunc值,但没有一个能解决这个问题。我希望重合多边形具有单一颜色,不管是哪种颜色。尝试使用glPolygonOffset(因子,单位)。可能会有帮

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

但是,当两组多边形重合且颜色不同时,生成的曲面将变成两种颜色的任意混合图案(随着摄影机位置的变化而变化,从而导致闪烁)。请看这张图片:


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

尝试使用
glPolygonOffset(因子,单位)
。可能会有帮助。

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

消除Z战斗的一种方法是使用多边形偏移


不幸的是,多边形偏移也带来了一些问题。

在调用透视图时,请尝试将z-near更改为远离零:

void gluPerspective(
    GLdouble    fovy,
    GLdouble    aspect,
    GLdouble    zNear,
    GLdouble    zFar);
从本网站:

深度缓冲似乎有效,但多边形似乎会通过前面的多边形流血。发生了什么事?

您可能以某种方式配置了zNear和zFar剪裁平面 这严重限制了深度缓冲区的精度。一般来说,这是 由zNear剪裁平面值太接近0.0引起。作为 zNear剪裁平面设置为越来越接近0.0,有效 深度缓冲区的精度急剧下降。移动zFar 将平面剪得离眼睛更远总是会产生负面影响 在深度缓冲精度上,但它不像移动 Z线性剪切平面

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

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


虽然缩小眼睛坐标深度范围肯定有助于保持多边形之间的接近、平行但不相交,但对于共面多边形则没有帮助,这显然是OP试图做到的。啊,好的一点。现在我不知道是否应该把这个答案留在这里。继续吧,把它留下,因为这是与主题相关的好建议,我们也有评论来解释为什么它不是这个特定场景的正确答案。没有伤害,我们都能从中学到一些东西。:)我很高兴你把这个留在这里,因为它刚刚帮助我解决了我自己的问题,这与这个问题的关键词是相切的。