我无法发布图片,因为我没有足够的声誉,所以只提供链接。
我正在使用OpenTK渲染3D模型(导入它可以正常工作)。模型是在草图中制作的,边缘线也是导出的。当我尝试渲染它时,线条会被绘制在所有多边形上,即使它们应该在后面,因此也是不可见的。我推断这可能是由于调用GL.End()然后切换到行模式和(可能)渲染现有图像。
有没有办法同时渲染线条和三角形(正确的深度和重叠)?如果没有,我应该如何绘制线条?我可以把它们画成三角形吗?
在我的渲染器中:http://i.stack.imgur.com/oC9Ux.png
在草图中(我试图让它看起来如何):http://i.stack.imgur.com/Jmu1S.png
我的渲染代码(世界是导入的collada数据,geometryLines是正在渲染的线,三角形是三角形的面)。
GL.Begin(PrimitiveType.Triangles);
GL.Color3(Color.Red);
GL.Enable(EnableCap.LineSmooth);
GL.Hint(HintTarget.LineSmoothHint, HintMode.Nicest);
foreach (Triangle tri in world.triangles)
{
GL.Vertex3(tri.vertices[0]);
GL.Vertex3(tri.vertices[1]);
GL.Vertex3(tri.vertices[2]);
}
GL.End();
GL.Begin(PrimitiveType.Lines);
GL.Color3(Color.Blue);
GL.Enable(EnableCap.LineSmooth);
GL.Hint(HintTarget.LineSmoothHint, HintMode.Nicest);
foreach (GeometryLine line in world.geometryLines)
{
GL.Vertex3(line.vertices[0]);
GL.Vertex3(line.vertices[1]);
}
GL.End();
SwapBuffers();
答案 0 :(得分:1)
(回复您的更新)
您看到的线条没有完全出现在您渲染的几何体上,这是Z-fighting的典型案例。深度缓冲区记录在每个像素处渲染的最近几何体的深度。当新几何体(您的线条)渲染在现有几何体(您的三角形)上方时,只有当它们的深度小于深度缓冲区中记录的深度时,才会保留新像素。但是,当您渲染两个或多或少完全相同深度的对象(例如您的线条和三角形的边缘)时,由于浮点错误,在给定像素处哪个几何体更近或更远会变得有些随意。
解决此问题的常用方法是使用名为depth biasing
的黑客。首先绘制基于三角形的几何图形,然后绘制线条,同时指示OpenGL将其深度偏向观察者一点点。这是使用glPolygonOffset函数实现的。结果是线条通过深度测试并被绘制在三角形上方。
这是用于贴花的技术,例如墙上的弹孔。请注意,您可能希望在绘制贴花时禁用深度书写,因为您通常认为它们与墙本身处于相同的深度,并且希望避免多个贴花之间的Z战斗。