2011-01-08 34 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--)表示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

有什麼不對呢?我如何繪製所有邊緣?

編輯:
沒關係,我放棄了SharpGL和OpenTK寫完全相同的代碼。它工作得很好,沒有我想知道什麼是錯的。這是一個很好的調用,因爲SharpGL使用了大量的內存。

回答

2

曾經有一個非常類似的問題。

這是由於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); 
+0

好球,但我會感到驚訝...爲什麼也會出現錯誤,而不背景上的矩形?並且,對於矩形,在深度測試中設置爲LEQUAL,爲什麼只有0的一致線性插值纔會在z座標中產生0以外的任何值? – Kos 2011-01-08 21:50:11