三維渲染帶來了很多新的挑戰:3D圖形是以模型而非簡單的位元影像來進行渲染的,我們需要切換到一個不同的角度來觀察接近或遠離螢幕的運動,同時需要以一種完全不同的方式來告訴XNA我們想在畫面的何處進行繪製。
當準備進行3D圖形渲染時,我們會使用一種基於矩陣的系統。矩陣可以將一系列的移動和變換編碼為一個緊湊的結構,然後應用到我們想要繪製的圖形中。執行此操作所需的大部分計算都以XNA函數的形式進行了封裝,因此我們無需過多的關注其內部運行方式。
與任何其他事物相同,可能需要一點時間來習慣以矩陣變換進行思維,不過一旦你習慣了就會發現它們是非常有用的工具。事實上,最終你可能會發覺比起XNA的精靈渲染方式,你更喜歡矩陣變換。
在進行3D渲染時,XNA通常會使用一套抽象的座標系統,而不是精靈渲染中基於像素的座標系統,也就是說這裡並不關注像素。雖然一開始聽上去這像是一個缺點,不過使自己擺脫像素座標實際上大有裨益。
當我們初始化XNA時,可以告訴它螢幕的尺寸然後座標系統會自動擴充從而進行尺寸匹配。因此,如果將繪圖物件向右移動一定的距離,實際移動的這段距離是與背景緩衝區尺寸無關的。所以,我們應考慮使用更小的緩衝區來提高效能,同時無需更改任何渲染代碼。
談到圖形的繪製,其實XNA無法繪製任何比三角形更複雜的內容。乍一看這似乎很嚴格,但事實上,你會發現它並不是我們在某些樣本項目中所使用的那樣。
在繪製時,我們將每個三角形稱為表面。構成三角形的點稱為頂點。圖中顯示了使用四個頂點建立的兩個三角形面。其中有兩個頂點被兩個三角形共用。
這些頂點實際上並不會被XNA顯示出來,只會顯示由它們定義的表面,圖中的頂點僅僅是為展示它們的作用。
除三角形以外其他可用的基元只有線條。
在渲染精靈時,每個獨立的繪圖調用都提供了進行繪製所需的全部資訊,3D渲染的方法則稍有不同。XNA維護了大量的狀態值資訊,比如當前渲染正在使用的紋理,是否啟用了透明度,是否開啟了光照等等。
為了使渲染效果與預期一致,這些狀態都必須在渲染調用之前進行設定。一旦狀態設定後,就會保持其狀態值,直到再次對其變更為止。