OpenTK Primitive类型在立即模式下切换

时间:2014-06-16 00:09:14

标签: c# opengl opentk sketchup

我无法发布图片,因为我没有足够的声誉,所以只提供链接。

我正在使用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();

1 个答案:

答案 0 :(得分:1)

(回复您的更新)

您看到的线条没有完全出现在您渲染的几何体上,这是Z-fighting的典型案例。深度缓冲区记录在每个像素处渲染的最近几何体的深度。当新几何体(您的线条)渲染在现有几何体(您的三角形)上方时,只有当它们的深度小于深度缓冲区中记录的深度时,才会保留新像素。但是,当您渲染两个或多或少完全相同深度的对象(例如您的线条和三角形的边缘)时,由于浮点错误,在给定像素处哪个几何体更近或更远会变得有些随意。

解决此问题的常用方法是使用名为depth biasing的黑客。首先绘制基于三角形的几何图形,然后绘制线条,同时指示OpenGL将其深度偏向观察者一点点。这是使用glPolygonOffset函数实现的。结果是线条通过深度测试并被绘制在三角形上方。

这是用于贴花的技术,例如墙上的弹孔。请注意,您可能希望在绘制贴花时禁用深度书写,因为您通常认为它们与墙本身处于相同的深度,并且希望避免多个贴花之间的Z战斗。