SharpGL: невозможно нарисовать все линии из списка - PullRequest
1 голос
/ 08 января 2011

у меня есть:

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<edges.Count; i++) на for(int i=edges.Count-1; i>=0; i--) показывает, что esges генерируются правильно, но они не отрисовываются.

Изображения:
for(int i=0; i<edges.Count; i++)
drawElements=false
http://img225.imageshack.us/img225/9295/noup.jpg

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

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

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

Что не так с этим? Как я могу нарисовать все края?

EDIT:
Неважно, я бросил SharpGL и написал точно такой же код в OpenTK. Это работает отлично, без меня интересно, что случилось. Это был хороший вызов, потому что SharpGL использует очень большой объем памяти.

1 Ответ

2 голосов
/ 09 января 2011

Однажды у меня возникла очень похожая проблема.

Это было связано с z-буфером.Если у вас есть плоскость и вы хотите нарисовать ее каркас, координаты перекрываются, и возникают такие артефакты.Это численно неопределенное поведение - рисование двух объектов на одной глубине.Вы никогда не знаете, какой из них идет впереди.

Одно из решений - немного сместить каркас.Я заметил это в некоторых пакетах 3D моделирования.В игровых движках также распространено смещение спрайтов по геометрии (следы от выстрелов на стене).Другим может быть отключение z-буфера и ручное закрытие скрытых линий.

В случае отключения рисования элементов может возникнуть другая проблема с z-буфером.Он ограничен дальними и ближними плоскостями отсечения.Скорее всего, вы рисуете линии точно на глубине одного из них (я думаю, далеко).

РЕДАКТИРОВАТЬ.Я немного прочитал Ваш код.Я хотел бы увидеть, как Вы строите матрицу проекции.Если вы его вообще не трогали, то (если я правильно помню) ближняя и дальняя плоскости отсечения находятся на -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);  
...