OpenGL深度问题

时间:2019-01-07 12:43:50

标签: opengl

我同时使用填充模式和线条模式“线框”绘制3D形状,得到三角形和线条之间的交点。

在渲染GL.Enable(EnableCap.DepthTest);之前启用深度缓冲区,这是绘制模型的代码:

            GL.BindVertexArray(VAO);

            Vector4 color;
            int colorLoc = GL.GetUniformLocation(programID, "color");

            if (BorderThickness > 0)
            {
                color = new Vector4((float)BorderColor.R / 255, (float)BorderColor.G / 255, (float)BorderColor.B / 255, (float)BorderColor.A / 255);
                GL.Uniform4(colorLoc, color.X, color.Y, color.Z, color.W);
                GL.PolygonMode(MaterialFace.FrontAndBack, PolygonMode.Line);
                GL.LineWidth(BorderThickness);
                GL.DrawArrays(PrimitiveType.LineStrip, 0, _positions.Count);
            }

            color = new Vector4((float)FillColor.R / 255, (float)FillColor.G / 255, (float)FillColor.B / 255, (float)FillColor.A / 255);
            GL.Uniform4(colorLoc, color.X, color.Y, color.Z, color.W);
            GL.PolygonMode(MaterialFace.FrontAndBack, PolygonMode.Fill);
            GL.DrawArrays(PrimitiveType.Triangles, 0, _positions.Count);

            GL.BindVertexArray(0);

我得到以下结果:

enter image description here

添加glPolygonOffset后的结果 enter image description here

它解决了问题,但线条不清楚。

1 个答案:

答案 0 :(得分:1)

如果距离较远的顶点的距离为1100,则不太可能需要0.1f精度的闭合平面。

如果我们看一下模型,所有的点似乎都在相似的范围内。这种问题看起来很像Z战问题。

尝试

projection = Matrix4.CreatePerspectiveFieldOfView(MathHelper.PiOver4, (float)width / (float)height, 10f, 2000f)

您将在工作规模上更加精确。如果您的点距相机的距离小于10,则会得到裁剪,但是考虑到网格的大小,这不应该成为问题。

由于Z缓冲区的精度是对数的,所以您与远端平面的距离越近,精度就越低,您将获得更多的Z对抗。考虑到您的点非常靠近远端平面,这可以解释我们所遇到的问题。通过使接近平面的高度接近您的一个顶点,问题应该消失了。