2011-07-24 50 views
1

與許多3D圖形程序一樣,我有一堆對象具有自己的模型座標(x,y中的-1到1,和z軸)。然後,我有一個從模型座標到世界座標的矩陣(使用正在繪製的對象的位置,旋轉和比例)。最後,我有第二個矩陣將這些世界座標轉換爲OopenGL ES 2.0將用於繪製到屏幕上的規範座標。最快的方法是從模型空間座標到OpenGL ES 2.0中的規範座標空間

因此,因爲一個物體可以包含許多頂點,所有這些頂點在世界空間和典範座標中都使用相同的變換,所以計算這兩個矩陣的乘積會更快一些,並將每個頂點放入結果矩陣而不是將兩個頂點放在兩個矩陣中。

但是,據我所知,在OpenGL ES 2.0着色器中似乎沒有辦法讓它計算矩陣一次,並繼續使用它,直到兩個矩陣中的一個用到glUniformMatrix4fv( )(或另一個設置統一的函數)被調用。所以看起來像一次計算矩陣的唯一方法就是在CPU上執行它,然後使用統一的方法生成GPU。否則,當這樣的:

gl_Position = uProjection * uMV * aPosition; 

它會一遍又一遍地計算的話,這似乎像它會浪費時間。

那麼,哪種方式通常被認爲是標準?還是有另一種我完全錯過的方式?就我所知,用於在OpenGL ES 2.0編程指南中實現OpenGL ES 1.1管道的着色器只使用了一個矩陣,那麼用過的更多?

回答

5

首先,「規範座標」的正確OpenGL術語是剪輯空間。

其次,它應該是這樣的:

gl_Position = uProjection * (uMV * aPosition); 

你貼什麼是一個矩陣/矩陣乘法接着是矩陣/矢量乘法。這個版本有2個矩陣/矢量相乘。這是一個實質性的差異。

您正在使用基於着色器的硬件;你如何處理矩陣取決於你。沒有什麼是「被認爲是標準的」;你做你最需要做的事情。這就是說,除非在模型空間中進行光照,否則在模型空間和4D同質剪輯空間之間通常需要一些中介。這是將位置和法線轉換爲空間以計算光線方向,點(N,L)等等的空間。

就個人而言,我不會建議的原因世界空間I explain thoroughly here.但無論是世界空間,攝像機空間,或別的東西,你通常有你需要的位置一些中間的空間是,在這一點上,上面的代碼變得有必要,因此沒有浪費時間。