2011-01-08 2 views
1

からすべての線を描くことができない私が持っている:想定され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--)に変更すると、正しくエッジが生成されますが、エッジは描画されません。

画像:
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は膨大な量のメモリを使用しているため、これは良い呼び出しでした。

答えて

2

一度私は非常に似た問題を抱えていました。

これはzバッファによるものです。あなたが飛行機を持っていて、ワイヤフレームを描画したい場合は、座標オーバーラップやそれらのようなアーティファクトが発生します。数値的に定義されていない振る舞い - 同じ深さの2つのオブジェクトを描画します。どちらが上に来るのかわからない。

1つの解決策は、ワイヤフレームを少しオフセットすることです。私はいくつかの3Dモデリングパッケージに気づいた。ゲームエンジンでは、スプライトをジオメトリ(壁面のガンマーク)に対してオフセットすることも一般的です。もう1つは、zバッファを無効にし、手動で隠線を隠すことです。

要素の描画を無効にすると、zバッファで別の問題が発生することがあります。それは遠くのクリッピング面に縛られています。おそらく、あなたはそれらの1つの深さに線を正確に描きます(私の推測は遠いものです)。

EDIT。私はあなたのコードを少し読んでいます。私が見たいのは、あなたが投影行列を構築する方法です。 (私が正しくリコールすれば)それに触れていないと、遠くのクリッピングプレーンはそれぞれ-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); 
+0

ナイスショットが、私は驚かれると思います...なぜエラーがなくても表示されます背景の矩形?そして、矩形で、LEQUALに設定された深度テストでは、0のみの一貫した線形補間では、z座標で0以外の何かが得られますか? – Kos

+0

アルゴリズムの数値的な不安定性のために数値エラーが発生することがあります。 OpenGLのT&Lパイプラインには何かがカラーバッファに当たる前に多くの変換が含まれているので、間違ったことがたくさんあります。そして、私はOpenGLが性能指向以来、継続的な分数や数値的に超安定した取り組みを使用していないことを確信しています。あなたは、ラインに沿った何か:0.2 + 0.6 = 0.8000007を知っています。 – Rekin

+0

初心者コードも含めることができますか?投影行列を含むもの。 – Rekin

関連する問題