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--)
Esgeが正しく生成されていることを示していますが、それらは描かれていません。
画像:
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
これの何が問題になっていますか?すべてのエッジを描くにはどうすればよいですか?
編集:
気にしないでください、私はSharpGlを落とし、Opentkでまったく同じコードを書きました。それは私が何が悪いのか疑問に思わずに優れています。 SharpGlは非常に大量のメモリを使用しているため、これは良い電話でした。
解決
かつて私は非常に似た問題を抱えていました。
Zバッファーによるものでした。飛行機があり、座標のオーバーラップやアーティファクトのようなアーティファクトよりも、ワイヤーフレームを描きたい場合。それは数値的に定義されていない動作です - 同じ深さに2つのオブジェクトを描画します。どちらが上に来るのかわからない。
解決策の1つは、ワイヤーフレームを少し相殺することです。いくつかの3Dモデリングパッケージでそれに気付きました。ゲームエンジンでは、ジオメトリ上のスプライトを相殺することも一般的です(壁の銃声マーク)。もう1つは、Zバッファーを無効にし、隠し線を手動で閉塞することです。
要素の描画を無効にする場合は、Zバッファーの別の問題になる可能性があります。それは遠くに囲まれ、飛行機の切り抜きに近づいています。おそらく、あなたはそのうちの1つの深さで正確に線を描きます(私の推測ははるかに1つです)。
編集。私はあなたのコードを少し読みました。私が見たい1つは、投影マトリックスをどのように構築するかです。 (正しく思い出す場合)よりも触れなかった場合、それぞれ近くのクリッピングプレーンは-1.0と1.0です。しかし、あなたがz = -6.0で描くので私は間違っているかもしれません...
もう1つは、交換してみてください。
gl.Vertex(x1, y1, 0.0f);
gl.Vertex(x2, y2, 0.0f);
の線に沿って何かがあります:
gl.Vertex(x1, y1, 0.01f);
gl.Vertex(x2, y2, 0.01f);