先來個宏觀上的理解:
其實這塊邏輯是個標准流程,而且其他地方介紹的也很多了,這里簡單提下。
坐標轉換,其實是不同坐標系之間的變換,一個渲染頂點,要想讓它呈現在屏幕上的某個位置,是需要讓這個頂點經過一個個坐標系的變換來進行的,每經過一個坐標系,它的坐標就會使用矩陣來執行變化一次,最終變化成為屏幕上的位置。
第一個Object Coordinates,這個比較好理解,就是模型的局部坐標系。這種坐標一般是美術建模的時候就會設定的,當然使用程序代碼繪制出來的坐標自然是代碼指定的。
比方說,一個坦克,美術在設計時,模型的幾何中心點就作為了整個模型的坐標原點,那么炮管上某個頂點的位置就是相對於幾何中心的一個偏移,假定為(0,1,1)。
第二個World Coordinates。還是坦克的例子,當游戲運行時,顯然是會把坦克擺放在場景里的某個出生點位置,假定為(500,500,1000)的位置,這個位置是相對於整個關卡的原點的。這一步的坐標變換,就是要計算出指定頂點相對於這個關卡原點的坐標。這個就是世界坐標了。
第三個Eye Coordinates。到這一步,坐標原點變成了攝像機的位置,以攝像機為原點,計算出指定頂點的坐標。
第四個Clip Coordinates。這一步最重要的是投影矩陣的構建,這個矩陣的推導過程,在這里,是應該要仔細研究下。重要的是帶了個w參數,用來計算下一步的NDC
所謂投影,就是投到了近裁剪面上。
第五個,Normal Device Coordinates.
這個圖僅供參考。其實就是把上一步計算出來的坐標,映射成一個比例關系的坐標,這個比例是這樣對應的,假設視錐體的四個面為Left,Right,Bottom,Top,Near,Far
X域的值,從 [Left,Right] 映射到 [-1,1]
Y域的值,從 [Bottom,Top] 映射到 [-1,1]
Z域的值,從 [Near,Far] 映射到 [-1,1]
如果指定的頂點在視錐體里,就會被映射到這個Cube里,這個坐標系的中心點是(0 ,0, 0)。
第六個,windon coordinates.其實就是窗口坐標轉換了。