C# SharpGL:Can';不要从列表中画出所有的线

C# SharpGL:Can';不要从列表中画出所有的线,c#,winforms,opengl,sharpgl,C#,Winforms,Opengl,Sharpgl,我有: 但它并没有画出所有的边缘。如果我更改drawerelements,它将绘制不同数量的边。更改(int i=0;i=0;i--)的表明ESGE生成正确,但未绘制 图像: 用于(int i=0;i=0;i--) drawerelements=false 用于(int i=0;i=0;i--) drawerelements=true 这有什么问题?如何绘制所有边 编辑: 没关系,我放弃了SharpGL,并在OpenTK中编写了完全相同的代码。它工作得很好,我不知道出了什么问题。这是一个很好

我有:

但它并没有画出所有的边缘。如果我更改
drawerelements
,它将绘制不同数量的边。更改(int i=0;i=0;i--)的
表明ESGE生成正确,但未绘制

图像:
用于(int i=0;i=0;i--)

drawerelements=false

用于(int i=0;i=0;i--)

drawerelements=true

这有什么问题?如何绘制所有边

编辑:

没关系,我放弃了SharpGL,并在OpenTK中编写了完全相同的代码。它工作得很好,我不知道出了什么问题。这是一个很好的调用,因为SharpGL占用了大量内存。

我曾经遇到过一个非常类似的问题

这是由于z缓冲区。如果你有一个平面,并且想要画它的线框,那么坐标会重叠,出现类似的伪影。这是数值上未定义的行为——在同一深度上绘制两个对象。你永远不知道哪一个在上面

一种解决方案是稍微偏移线框。我注意到在一些3d建模软件包中。在游戏引擎中,在几何体上偏移精灵(墙上的枪弹痕迹)也是很常见的。另一种可能是禁用z缓冲区并手动遮挡隐藏线

禁用图元绘制的情况可能是z-buffer的另一个问题。它以远剪裁平面和近剪裁平面为边界。最有可能的情况是,你在其中一条线的深度上画线(我猜是远的)

编辑。我读了一下你的代码。我想看看你是如何构造投影矩阵的。如果您根本没有触摸它,那么(如果我记得正确的话)近剪裁平面和远剪裁平面分别为-1.0和1.0。但是,我可能错了,因为你在z=-6.0处画图

另一件事,尝试替换:

    private void openGLCtrl1_Load(object sender, EventArgs e)
    {
        gl = this.glCtrl.OpenGL;
        gl.ClearColor(this.BackColor.R / 255.0f,
            this.BackColor.G / 255.0f,
            this.BackColor.B / 255.0f, 1.0f);
        gl.Clear(OpenGL.COLOR_BUFFER_BIT | OpenGL.DEPTH_BUFFER_BIT);
    }

    private void openGLControl1_OpenGLDraw(object sender, PaintEventArgs e)
    {
        gl.Clear(OpenGL.COLOR_BUFFER_BIT | OpenGL.DEPTH_BUFFER_BIT);
        gl.LoadIdentity();
        gl.Translate(0.0f, 0.0f, -6.0f);

        if (!draw) return;

        bool drawElements = false;

        if (drawElements)
        {
            gl.Begin(OpenGL.TRIANGLES);

            for (int i = 0; i < elementNo; i++)
            {
                for (int j = 0; j < 3; j++)
                {
                    float x, y, t;
                    x = nodesN[elements[i, j], 0];
                    y = nodesN[elements[i, j], 1];
                    t = nodesN[elements[i, j], 2];

                    gl.Color(t, 0.0f, 1.0f - t);
                    gl.Vertex(x, y, 0.0f);
                }
            }

            gl.End();
        }

        gl.Color(0f, 0f, 0f);            

        gl.Begin(OpenGL.LINES);

        //for(int i=edges.Count-1; i>=0; i--)
        for(int i=0; i<edges.Count; i++)
        {               

            float x1, y1, x2, y2;
            x1 = nodesN[edges[i].First, 0];
            y1 = nodesN[edges[i].First, 1];

            x2 = nodesN[edges[i].Second, 0];
            y2 = nodesN[edges[i].Second, 1];

            gl.Vertex(x1, y1, 0.0f);
            gl.Vertex(x2, y2, 0.0f);                
        }   

        gl.End();          
    }
有点类似于:

gl.Vertex(x1, y1, 0.0f);
gl.Vertex(x2, y2, 0.0f);  

好球,但我会很惊讶。。。为什么在没有矩形背景的情况下也会出现错误?对于矩形,在深度测试设置为LEQUAL时,为什么只有0的一致线性插值在z坐标中产生除0以外的任何结果?有时数值误差是由于算法的数值不稳定性引起的。由于OpenGL T&L管道在任何东西进入颜色缓冲区之前都包含许多转换,因此有很多地方会出错。我确信OpenGL没有使用连分数或任何数值上超级稳定的装置,因为它是面向性能的。你知道,大致是这样的:0.2+0.6=0.8000007。你能不能也包括初始化代码?包含投影矩阵的。这不是值问题。它根据迭代的方向绘制(或不绘制)直线。这一定是内存问题。如果这是一个价值问题,它将以与绘图顺序相同的方式绘制。我注意到这个库有一些内存错误,所以我把它扔了。我现在使用OpenTDK,一切都很好:)
gl.Vertex(x1, y1, 0.0f);
gl.Vertex(x2, y2, 0.0f);  
gl.Vertex(x1, y1, 0.01f);
gl.Vertex(x2, y2, 0.01f);