我同时使用填充模式和线条模式“线框”绘制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);
我得到以下结果:
它解决了问题,但线条不清楚。
答案 0 :(得分:1)
如果距离较远的顶点的距离为1100,则不太可能需要0.1f精度的闭合平面。
如果我们看一下模型,所有的点似乎都在相似的范围内。这种问题看起来很像Z战问题。
尝试
projection = Matrix4.CreatePerspectiveFieldOfView(MathHelper.PiOver4, (float)width / (float)height, 10f, 2000f)
您将在工作规模上更加精确。如果您的点距相机的距离小于10,则会得到裁剪,但是考虑到网格的大小,这不应该成为问题。
由于Z缓冲区的精度是对数的,所以您与远端平面的距离越近,精度就越低,您将获得更多的Z对抗。考虑到您的点非常靠近远端平面,这可以解释我们所遇到的问题。通过使接近平面的高度接近您的一个顶点,问题应该消失了。