2014-12-01 73 views
1

當我可以自己排列位置數學時,推動/彈出矩陣來轉換形狀的目的是什麼?我可以理解使用上述矩陣做更困難的操作(例如旋轉),但爲什麼要特別翻譯?我爲什麼要使用glTranslate?

public void render() 
     { 
      positionX++; 

      GL.PushMatrix(); 
      GL.Translate(positionX, positionY, 0); 

      GL.MatrixMode(MatrixMode.Modelview); 
      GL.LoadIdentity(); 

      GL.Begin(PrimitiveType.Quads); 

      GL.Vertex2(0, 0); 
      GL.Vertex2(0 + widthX, 0); 
      GL.Vertex2(0 + widthX, 0 + widthY); 
      GL.Vertex2(0, 0 + widthY); 

      GL.PopMatrix(); 

      GL.End(); 
     } 

public void render() 
     { 
      positionX++; 
      GL.MatrixMode(MatrixMode.Modelview); 
      GL.LoadIdentity(); 

      GL.Begin(PrimitiveType.Quads); 

      GL.Vertex2(positionX, positionY); 
      GL.Vertex2(positionX + widthX, positionY); 
      GL.Vertex2(positionX + widthX, positionY + widthY); 
      GL.Vertex2(positionX, positionY + widthY); 

      GL.End(); 
     } 
+1

一般來說,矩陣的使用允許輕鬆地鏈接操作。不知道這是*的原因,或者它是否回答你的問題。 – BradleyDotNET 2014-12-01 22:38:15

+2

你不應該;該函數與GL.Begin和GL.End函數一起被棄用 – 2014-12-01 22:40:47

+1

在'glTranslatef'後面添加'glRotatef(45,0,0,1)',並運行程序。現在將'glRotatef'移動到'glTranslatef'之前,然後重新運行你的程序。 – 2014-12-01 22:43:19

回答

2

我不認爲這是一個愚蠢的問題,儘管當您更多地使用OpenGL時,答案可能會變得清晰。

使用glTranslate(或類似的方法)進行翻譯當您需要不同的轉換順序時,一定能派上用場。如果翻譯是您想要執行的第一個轉換,則只能更改頂點座標。如果你想做的話,例如,旋轉,然後翻譯,然後再旋轉,你必須使用矩陣。

但是,主要原因是通常你不會在每一幀都發送頂點到GPU。這是非常緩慢的,實際上,您使用的所有GL.*方法現在已被棄用。它是目前實現的方法是:

  1. 發送的GPU,一旦你開始渲染任何東西之前所有的頂點數據(記住它可能是幾千個多邊形或更多的)。
  2. GPU將數據存儲在其內部存儲器中(這就是爲什麼您的顯卡上有很多MB/GB的RAM),併爲您提供一個ID(例如1)。
  3. 渲染幀時,只需告訴GPU「用id 1保存的東西」即可。這是一個單一的OpenGL調用 - 請記住,每個OpenGL調用都有一個代價(意味着時間),所以調用的調用越少,圖形就會越快。

對於紋理,着色器和其他東西也一樣。

因此,一般情況下,一旦將其發送到GPU,您一般不會修改頂點數據(技術上可以修改,但出於性能原因不可取)。所以如果你想做任何轉換,你必須使用矩陣。作爲最後一點,我會再次說,你正在使用已棄用的功能,這對學習一些基本概念我沒有那麼壞,但我肯定會推薦移動到當前的OpenGL(或者至少OpenGL 3 ),並且瞭解着色器,頂點緩衝區,頂點數組和所有新的有光澤的東西。

TL; DR:是的,你可以自己動手。但最好讓你的顯卡做它,因爲它可以更快地做到這一點。事實上,這是擁有專用顯卡的主要原因。

1

什麼入棧/矩陣時,我可以排序的做位置數學自己翻譯的形狀的目的是什麼?

因爲它允許OpenGL將操作卸載到GPU,並在其中大規模並行化。好看,試圖超越這一點。 GPU革命開始於第一批卸載這種操作的GPU。當時稱爲T'n'L加速(變換和照明),它對15年前開始的PC圖形革命負有單一責任。

考慮到glTranslate和朋友都不贊成這樣的事實,你的問題可能會被改寫爲

什麼是供應平移矩陣到頂點着色均勻,當我可以只是有點做翻譯的形狀的目的數學自己呢?

好了,原因是,「做自己」,通常歸結爲像

foreach(v in vertices) 
    v_new.position = v.position + t 

這通常會在CPU上執行,即使你使用類似的openmpi的構建並行化僅限於CPU內核的數量。

通過OpenGL矩陣操作實現翻譯,OpenGL實現可以大規模並行操作;在現代GPU的情況下,幾千個「流」(大致以鎖步運行的線程)並行執行。

儘管完全可以執行簡單的翻譯,但正如上面的着色器一樣,您通常會使用矩陣將多個轉換合併爲一個單獨的操作。