【问题标题】:SharpGL: Can't draw all lines from ListSharpGL:无法从列表中绘制所有线条
【发布时间】:2015-05-15 03:51:52
【问题描述】:

我有:

float[,] nodesN = null; //indexes:
                        //number of node;
                        //value index 0->x, 1->y, 2->temperature
int[,] elements = null; //indexes:
                        //indexof element (triangle)
                        //1, 2, 3 - vertexes (from nodesN)
List<Pair> edges = null; //Pair is a class containing two int values which are
                         //indexes of nodesN

并且应该执行SharpGL.OpenGLCtrl上的所有元素和边缘的函数

    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();          
    }

但它并没有画出所有的边缘。如果我更改 drawElements 它会绘制不同数量的边。将for(int i=0; i&lt;edges.Count; i++) 更改为for(int i=edges.Count-1; i&gt;=0; i--) 表明esges 生成正确,但未绘制。

图片:
for(int i=0; i&lt;edges.Count; i++)
drawElements=false
http://img225.imageshack.us/img225/9295/noup.jpg

for(int i=edges.Count-1; i&gt;=0; i--)
drawElements=false
http://img828.imageshack.us/img828/9595/nodown.jpg

for(int i=0; i&lt;edges.Count; i++)
drawElements=true
http://img64.imageshack.us/img64/4929/withup.jpg

for(int i=edges.Count-1; i&gt;=0; i--)
drawElements=true
http://img833.imageshack.us/img833/9167/withdown.jpg

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

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

【问题讨论】:

    标签: c# winforms opengl sharpgl


    【解决方案1】:

    曾经我遇到过非常相似的问题。

    这是由于 z-buffer 造成的。如果您有一架飞机并且想要绘制它的线框,那么坐标就会重叠并且会出现类似的伪影。这是数值上未定义的行为 - 在相同深度上绘制两个对象。你永远不知道哪一个位居榜首。

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

    禁用元素绘制的情况可能是 z-buffer 的另一个问题。它以远近剪裁平面为界。很可能你在其中一条线的深度准确地画线(我的猜测是远一)。

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

    另一件事,尝试替换:

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

    大致如下:

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

    【讨论】:

    • 不错的镜头,但我会感到惊讶...为什么在背景没有矩形的情况下也会出现错误?对于矩形,在深度测试设置为 LEQUAL 时,为什么只有 0 的一致线性插值会在 z 坐标中产生除 0 以外的任何值?
    • 有时由于算法的数值不稳定性会出现数值错误。由于 OpenGL T&L 管道在任何东西到达颜色缓冲区之前包含许多转换,因此会出现很多问题。而且我确信 OpenGL 没有使用连分数或任何数值超稳定的装置,因为它是面向性能的。你知道,类似的东西:0.2 + 0.6 = 0.8000007。
    • 您还可以包含启动代码吗?包含投影矩阵的那个。
    • 这不是价值问题。它根据迭代的方向绘制(或不绘制)线。所以这一定是一些内存问题。如果这是价值问题,则无论绘制顺序如何,都将以相同的方式绘制。我注意到这个库有一些内存错误,所以我放弃了它。我现在使用 OpenTDK,一切正常 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多