SharpGL: не могу нарисовать все линии из списка
Вопрос
У меня есть:
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/nuoup.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/ whithdown.jpg.
Что не так с этим? Как я могу рисовать все края?
РЕДАКТИРОВАТЬ:
Не берите в голову, я бросил SharpGL и написал точно такой же код в Opentk. Работает экспортировка без удивления, что было не так. Это был хороший звонок, потому что SharpGL использует огромное количество памяти.
Решение
Однажды у меня была очень похожая проблема.
Это было связано с Z-буфером. Если у вас есть самолет и хочу нарисовать его каркас, чем координаты перекрываются и артефакты, такие как возникающие. Это численно неопределенное поведение - рисунок двух объектов на той же глубине. Вы никогда не знаете, какой из них приходит сверху.
Одно решение - значит компенсировать каркас. Я заметил, что в некоторых трехмерных пакетах моделирования. В игровых двигателях также распространено офсетные спрайты на геометрии (огнестрельные следы на стене). Другой может отключить 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);