原文:ExtremeTech 3D
Pipeline Tutoria
June 13, 2001 - By Dave
Salvator
轉載請注明出處。
介紹
從令人著迷的電影特效,到醫學成像、電子游戲和更多的領域,3D圖形所帶來的沖擊不亞于一場革命。這項從五年前(1996年)開始,帶來了個人電腦消費風暴的技術,根源于學術界和軍事。其實從某種程度上來說,我們今天在個人電腦上所享受的3D圖形算是一種“和平紅利”,許多最初設計軍事模擬器的專家如今在從事3D圖形芯片,電影和游戲開發產業的工作。
除娛樂之外,3D圖形技術在計算機輔助設計(CAD)上為工業設計帶來了巨大的飛躍。制造商不但可以不使用任何材料設計并“構造”出他們的產品,還可以通過連接擁有電腦輔助建造(CAM)系統的制造機械來使用這些3D模型。但對我們大多數人來說,3D圖形技術給娛樂產業帶來的沖擊最大,包括電影和游戲,正因為如此,我們許多人都對3D圖形相關的技術和術語有所了解。
記住不是所有的渲染系統都有著相同的目標。對于離線渲染系統,像CAD程序中所使用的,精確度比幀速要重要得多。例如,這種模型有可能用來制造飛機部件。實時渲染器,像游戲引擎和模擬器,趨向于強調固定的幀速來得到平滑流暢的動畫效果,為了這一目的寧愿犧牲掉圖形和紋理的細節。
有些渲染器是混合型的,比如電影《玩具總動員》所使用的。藝術家和程序員們使用Pixar的Renderman技術來創造眩目的視覺場景,但動畫的每一幀在服務器場——一個計算機集群,渲染工作可以在其中分布式進行——上要耗費數小時進行渲染。這些離線渲染的幀之后被排成標準電影的每秒24幀的序列,來制作電影的最終剪輯。
隨著急速增長的對3D芯片渲染能力的需求,“消費級3D”和“工作站級3D”之間的界線已經非常模糊了。然而,實時游戲引擎仍然做了許多折衷來保持幀速,一些甚至設計了“油門”來控制當幀速降低到規定的水平之下時自動打開和關閉某些特性。相比之下,工作站級3D需要一些當今游戲不需要的高級特性。
3D圖形領域廣大而復雜。我們的目標是寫出一系列相當技術性的,但通俗易懂的,有關3D圖形技術的文章。我們從用來創建3D圖形的,被稱作3D管線的多步處理流程開始。我們會遍歷整個3D管線,從場景中一個三角形開始,到最終一個像素被畫出。我們會提到一些與渲染3D場景相關的數學,盡管對3D算法只是做簡單的介紹(如果你想深入學習,在本文最后我們列出了相當數量的參考)。
在管線中,準備就緒
因為3D圖形渲染本身的有序特性,因為有如此多的計算要做,大量的數據要處理,整個處理過程被拆分成不同的步驟,有時被稱作階段(Stage)。這些階段被依次送入前面提到的3D圖形管線中。
創建場景所需的巨大工作量使得3D渲染系統的設計者們(包括硬件和軟件)尋找一切可能的方法來去除不必要的工作。有設計師這么諷刺過,“3D圖形學是欺騙而不被抓住的藝術”解釋一下,這句話的意思是說,3D圖形學中的一種藝術形式就是優雅地通過降低場景中的顯示細節來獲得更好的性能,但卻不讓觀察者注意到顯示質量上的損失。處理器和內存帶寬是寶貴的資源,因此設計師為節約它們所做的任何努力都會對性能非常有利。一個重要的例子就是揀選,它用來告訴渲染器,“如果觀察攝像機(觀察者的眼睛)看不到它,別自找麻煩去處理它,只操心攝像機能看到的東西吧。”
伴隨著相關處理步驟的數量和復雜度,這些階段(Stage)在管線中的次序可以在執行時改變。之后我們很快會更加詳細地檢閱這些階段中所做的操作,概括地說,一個常規的3D管線順序拆分為四個片段:應用/場景,幾何圖元,三角形設置和光柵化/渲染。雖然下面的片段草圖可能看起來比較嚇人,當你讀完這篇文章時,你會成為極少數真正理解3D圖形工作原理的人中的一員,我們認為你將會想要理解得更加深入。

操作在哪里完成
3D世界的大多數高層次方面操作由管線中應用階段部分(有爭論認為它技術上不屬于3D管線的一部分)的應用軟件負責管理,余下的三個主要階段通常由一套應用程序接口(API)負責管理,例如SGI的OpenGL,微軟的Direct3D,或Pixar的Renderman。API通過調用圖形驅動程序和硬件來在硬件中執行絕大多數的圖形操作。
圖形API實際上是為應用提供了硬件抽象,反過來說,為應用提供了真正的設備無關性。因而,這些API通常被稱作硬件抽象層(HALs)。它們的設計目標非常簡明——應用開發者一旦為某個API寫出了程序,這個程序就可以(而且應該)運行在任何支持這個API的硬件上。相反的,硬件制造者為這些API編寫驅動程序,這樣為這些API寫的應用就可以在它們的硬件上運行了(圖1)。說明一下,添加“應該”這個詞是因為有些時候因為兼容性問題會導致API的不正確使用(被稱作違規),這會導致應用依賴于某個特定的硬件特性,或者導致在某個硬件驅動下API特性被錯誤地執行,最終產生了錯誤的或不可預知的結果。

空間入侵者
深入管線細節之前,我們首先要從高層了解3D物體和3D世界是如何定義,物體如何被定義,放置,定位,如何在更大的3D空間內,或者就在它們自己的邊界內進行控制。在一個3D渲染系統中,多個笛卡爾坐標系(x-(左/右),y-(上/下),z-(遠/近))被應用在管線的不同階段。被運用在互相關聯但各不相同的目的的同時,每個坐標系都提供了精確的數學方法來在空間中定位和描述物體。毫無意外的,每個這樣的坐標系都被稱作“空間”。

3D場景中的物體和場景本身在經過3D管線時被連續地進行轉換或者變換,一共要通過五個空間。下面是這些空間的簡單概述:
模型空間(Model
Space):模型在它們自己的坐標系中,原點是模型上的某個點,比如在一個英式足球運動員模型的右腳上。而且,模型有一個控制點或者“把手”。用來移動模型,3D渲染器只需要移動控制點,因為模型空間中模型的坐標與它的控制點保持固定的關聯關系。此外,同樣的“把手”也可以用來旋轉物體。
世界空間(World
Space):在這里模型被放置在實際的3D世界中,使用一個統一的世界坐標系。事實上許多3D程序跳過了世界空間而直接轉到了裁剪空間或視圖空間。OpenGL中并不真正有世界空間這個概念。
視圖空間(View Space - 也被稱作攝像機空間 Camera Space):這個空間中,當前觀察攝像機被程序定位在3D世界坐標的某個點上(通過圖形API)。世界坐標系被執行變換(使用矩陣數學,我們稍后會探討),從而使攝像機(你的眼睛)處在坐標系的原點,沿著z軸朝向場景。如果世界空間的變換被跳過了,場景就被直接變換到視圖空間,攝像機同樣被放在原點沿著z軸方向。沿著z軸遠離攝像機深入場景時z坐標的值是增加還是減少由程序員決定的,但我們現假設你沿著z軸看過去的坐標是增加的。注意揀選,背面剔除和光照操作是在視圖空間進行的。
視圖體實際上由投影(Projection)來創建的,就像名字所暗示的那樣,“投影場景”到攝像機的前面。從這個意義上來說,這是種角色倒轉,攝像機現在變成了放映機,場景的視圖體通過關聯攝像機進行定義。把攝像機想象成某種全息放映機,但它不是把3D圖像放映到空氣中,而是把場景投影“進”你的顯示器。這個視圖體的形狀可以是矩形(稱作平行投影)也可以是棱錐形(稱作透視投影),后者被稱作平截視圖體(View Frustum)(通常也叫做視圖體(Frustum),雖然視圖體這個名字更常用)。
視圖體定義了攝像機可以看到的部分,同樣重要的是,它也定義了攝像機看不到的部分,這樣一來,許多物體模型和世界的某些部分都可以被丟棄,以節約3D芯片的運算周期和內存帶寬。
視圖體看起來像是個頂部被切掉的棱錐。棱錐的頂部緊貼攝像機的視點并向外發散。視圖體的頂部被稱作近(前)截面,另一面被稱作遠(后)截面。整個被渲染的3D場景必須處在近截面和遠截面之間,同時被視圖體的側面和頂部限制。如果模型中的三角形(或者世界的一部分)超出了視圖體,它們就不會被處理。同樣的,如果一個三角形有一部分在視圖體里面一部分在外面,超出的部分會被視圖體截掉,因此這里才會使用“裁剪”(Clipping)這個術語。盡管視圖空間中的視圖體有裁剪面,裁剪的實際操作是在視圖體變換到裁剪空間時執行的。
深入空間
裁剪空間(Clip
Space):與視圖空間相似,但是視圖體被“壓扁”成了一個單位立方體,x和y坐標被規格化到了-1到1之間,z坐標在0到1之間,這可以簡化裁剪計算。“透視分割”執行規格化操作,通過用一個特殊的“w”值除所有的x,y和z頂點坐標,這個值就是我們后面將會詳細說明的縮放因子。透視分割使近處的物體變大,遠處的物體變小,跟你所期望看到的真實場景一樣。
屏幕空間(Screen Space):在這里3D圖像被轉換為x和y的二維屏幕坐標來做二維顯示。注意z和w坐標依然被圖形系統保留,用于最終渲染之前的深度/Z緩存(參見下面的Z緩存一節)和背面剔除中。注意場景到像素的轉換,也就是光柵化的操作,還沒有開始。
因為這些不同空間之間的變換絕大多數實質上都是改變參照系,很容易混淆。3D管線容易把人搞暈的一部分原因就是沒有一個“確定的”路線來執行所有這些操作,因為研究人員和程序員們各自發現了一些有用的技巧和優化方法,而且通常都會有多個方法可以解決一個給定的3D/數學問題。但是,通??臻g變換的處理步驟都按照我們前面介紹的順序來進行。
要對這些不同空間之間如何相互影響有個概念,考慮一下下面這個例子:
拿幾塊樂高玩具,把它們拼在一起做個模型。想象一下把單獨的塊認作物體的邊緣,塊與塊的連接部分看作頂點(雖然樂高建筑并不使用3D模型常用的三角形圖元,但我們的例子用四邊形也很合適)。把這個物體放在你面前,模型空間的原點坐標應該是左下方離你最近的那個角,模型的所有坐標都由這個點來衡量。原點實際上可以是模型的任意一部分,但左下方最近的角是最常用的。當你在房間里(3D世界空間或者視圖空間,由3D系統決定)移動這個物體,塊與塊之間的相對位置是固定不變的(模型空間),雖然它們相對房間的坐標在變化(世界空間或視圖空間)。
3D管線數據流
某種意義上來說,3D芯片就是物理具體化的3D管線,數據在這里從一個階段(Stage)“順流”到另一個階段。有一處需要注意,管線中的大多數應用/場景階段和早期的圖元階段的操作是對每頂點進行的,然而揀選和裁剪是對每三角形進行的,渲染操作是對每像素進行的。為提高性能,管線中不同階段的計算可以重疊。例如,頂點和像素操作在Direct3D和OpenGL中都相互獨立,所以可以做到一個三角形在圖元階段時,另一個在光柵化階段。而且,圖元階段對兩個或多個頂點的計算和光柵化階段對兩個或多個頂點的計算(來自相同的三角形)可以同時執行。
管線的另一個優勢是,因為在圖元階段不會有數據在頂點間傳遞,渲染階段像素間也沒有數據傳遞,芯片制造者可以實現多個像素管線,通過并行處理這些獨立實體來獲得可觀的性能提升。還有需要注意的一處是實時渲染中管線的使用,盡管有許多好處,也不是沒有缺點。舉個例子,一旦一個三角形被送入管線,程序員幾乎就跟它揮手道別了。要獲取管線中頂點的狀態或者顏色/透明度信息要付出非常高的性能代價,還可能導致管道阻塞,這是絕對不該做的事。
管線階段——深入探討
1.
應用/場景

3D應用程序自身可以認作是3D管線的開始,盡管它并不真的是圖形子系統的一部分,但卻是由它來啟動圖形生成處理以生成最終的場景或者動畫幀。應用程序還設置觀察攝像機的位置,也就是你在3D世界中的“眼睛”。物體,包括動的和不動的首先在應用程序中以幾何圖元或者基本的構造塊來描述。其中三角形是最常用的圖元。它們簡單易用因為三個頂點恰好描述一個平面,但四個或更多頂點的多邊形不一定位于同一個平面上。更復雜的系統支持被稱作高次表面,它們是不同類型的曲面圖元,這些我們很快會講到。
3D世界和其中的物體是在程序中創建的,像3D Studio
Max,Maya,AutoDesk 3D
Studio,Lightwave和Softimage我們僅舉這幾個例子。3D藝術家們通過這些程序不但可以創建模型,還可以讓它們動起來。模型首先用大量的三角形構建,然后進行著色和貼紋理。接下來,依賴于渲染引擎的約束——離線的或者實時的——藝術家可以降低這些高精度模型的三角形數量來適合給定的性能限制。
應用程序控制物體從一幀移動到另一幀,無論是離線渲染器還是游戲引擎。應用程序遍歷幾何數據庫收集必要的物體信息(幾何數據庫包含了構成物體的所有幾何圖元),移動所有下一幀動畫中要變化的物體。以一個游戲引擎為例,渲染器不會完成所有的工作。游戲引擎同樣必須處理AI(人工智能),碰撞檢測和物理特性,聲音,以及網絡(如果游戲在網絡多人模式下進行)。
所有的模型都有一個默認的“姿勢”,比如人物模型,默認姿勢是所謂的“達芬奇姿勢”,因為這個姿勢很像達芬奇著名的“維特魯威人”。一旦應用程序指定了模型的新“姿勢”,模型就準備好了下一步處理。
一些應用程序會在這里執行一個操作,叫做“遮擋剔除”,可見測試測定物體是部分還是全部被它前方的其他物體遮擋(蓋?。?。如果被擋住了,被擋住的物體,或者物體被擋住的部分會被丟棄。節省下的計算代價值得考慮,否則這些計算要在管線中執行,尤其是有著復雜深度的場景,也就是處在場景后面的物體有多“層”物體在它們前面,在觀察攝像機前擋住了它們。
如果這些被遮擋的物體可以提早被剔除,它們就不必在管道中繼續前進,這就節省了不必要的光照、著色和紋理計算。例如,在一個你跟哥斯拉對抗的游戲中,那個大家伙藏在你正走向的一幢大樓后面,你看不到他(卑鄙的家伙)。這時游戲引擎不必繪制哥斯拉的模型,因為大樓的模型擋在了他的前面,這就可以節約下硬件在這一幀動畫中渲染哥斯拉模型的消耗。
一個更重要的步驟是對每個物體的一個簡單的可見檢查。這可以通過檢查對象是否在視圖體中(全部或者部分)來完成。一些引擎還嘗試測量視圖體中的一個物體是否完全被另一個物體擋住了。這些操作典型地使用簡單的概念如入口(Portal)和可見集(Visibility
Sets)來完成,特別是室內場景。這是在3D游戲引擎中實現的兩種簡單的技術,使引擎不必再繪制3D世界在攝像機中看不到的部分。[Eberly, p.
413]最初Quake中使用的是稱作潛在可視集(PVS)的技術,它把世界劃分為小塊。本質上就是,如果玩家處在世界的一個特定部分,看不到其他區域時,游戲引擎就不必處理其他部分的數據。
另一個程序員們喜歡的降低工作量的技巧是使用綁定盒(Bounding
Box)。例如你有個10000個三角面的殺手兔模型,與其測試模型的每個三角形,程序員可以把模型用一個綁定盒包住,綁定盒由12個三角形組成(六面體的每個面兩個三角形)。然后就可以測試剔除條件(基于綁定盒的頂點而不是兔子模型的頂點)來確定殺手兔在場景中是否可見。在你通過指定殺手兔模型中的共享頂點(相鄰三角形可以共享的頂點,我們后面會詳細探究的一個概念)來進一步減少頂點數之前,針對于這個測試你已經把總頂點數從30000(殺手兔模型)個減少到了36個(綁定盒)。如果檢測表明綁定盒在場景中不可見,殺手兔模型就可以簡單地被丟棄,你就為自己省了一大堆工作。
你LOD了沒有?
另一個消除額外工作的方法就是所謂的物體細節等級(Level of
Detail),被稱為LOD。這項技術是有損的,但對于它的一般應用來說,損失的模型細節通常是覺察不到的。物體模型由數個不同的細節等級構造。很恰當的例子是一個最高細節等級的戰斗機模型使用10000個三角形,附帶的低精度細節等級分別由5000,2500,1000和500個三角形組成。具體使用哪一個細節等級由戰斗機距離觀察攝像機的距離決定。如果很近,就使用最高的細節等級,如果是剛剛能在攝像機中看到而已,就使用最低的細節等級,在這兩種情況之間,就使用其它的細節等級。
細節等級的選擇總是由應用程序在將物體送入管線做進一步處理之前完成。為了決定使用哪一個細節等級,應用程序把物體的一個簡化版本(通常只是中心點)映射到視圖空間,以測定到物體的距離。這項操作獨立于管線執行。必須確定具體的細節等級以決定將哪個三角形的集合(不同細節等級)送入管線。
幾何專用技巧
一般來說,三角形多的模型看起來更加真實。這些三角形的信息——它們在3D世界中的位置,顏色等——保存在每個三角形的頂點描述中。這些3D世界中的頂點集合被稱作場景數據庫,跟上面提到的把動物模型做為幾何數據庫非常相像。模型中的彎曲部分,比如汽車上的輪子,需要許多三角形來近似形成一個光滑曲面。在一個圓形中努力減少頂點/三角形數量會造成不利影響,例如,使用低細節等級將造成一個“崎嶇不平”的圓,構成圓的三角形頂點都可以看到。如果用更多的三角形來表現這個圓,它的邊緣看起來會平滑得多。我們可以進行優化來減少實際送入管線的三角形數量卻不必降低模型細節,因為相連的三角形頂點是共享的。程序員可以使用連接的三角形繪制模式來降低頂點數,即三角帶和扇形。例如:
在三角帶模式下,最簡單的例子就是由兩個三角形拼成的矩形,它擁有一條共享的斜邊。通常,單獨繪制兩個這樣的三角形會產生六個頂點。但是,由于兩個三角形連在一起,它們形成了一個簡單的,由四個頂點描述的三角帶,把平均每個三角形需要的頂點數減少到了兩個,優于原先的三個??雌饋頊p少得并不多,隨著三角形數目的增多(頂點數也同樣變化)優勢也會愈加明顯,平均每個三角形單獨擁有的頂點數降低到了一個。[RTR, p. 234]以下是計算平均頂點數的公式,給定m個三角形:
1+2m
因此,在一個有100個三角形的三角帶中,平均每個三角形頂點數是1.02個,或者說總共有102個頂點,相比獨立三角形的300個頂點是相當可觀的節約。在這個例子中,我們通過把m個三角形改用三角帶達到最大限度節約了成本,一共是m+2個頂點。這些節約可以積少成多,當考慮Direct3D中使用32個字節的數據來描述一個頂點的屬性(如位置,顏色,透明度等)。當然,整個場景不可能只由三角帶和扇形組成,但為了相應節約的成本,開發人員會盡量使用它們。
在扇形情況下,程序員可能使用20個三角形排列在一個扇形區來描述一個半圓。正常情況下由60個頂點組成,但通過使用扇形來描述,頂點數量可以降低到22個。第一個三角形有三個頂點,但接下來每個新增的三角形只需要增加一個頂點,扇形的中心有一個所有三角形共享的頂點。同樣達到了使用三角帶/扇形最大限度的節約。
使用三角帶和扇形的另一大優勢是,它們是“無損”的數據壓縮,這意味著并沒有任何信息和圖形精度為了數據壓縮和速度提升而損失掉。此外,以三角帶和扇形向硬件傳送三角形可以提高頂點緩存的效率,這可以加速幾何處理的性能。另一個程序員可以使用的工具是索引過的三角形列表,可以用來描述巨量的三角形,m個三角形,使用m/2個頂點,大約是使用三角帶和扇形壓縮量的兩倍。這個代表性的方法是大多數硬件架構的首選方法。

曲面簡介
與其使用大量三角形來表現一個曲面,3D藝術家和程序員還可以使用另一個工具:高次曲面。這些曲面圖元有著更為復雜的數學描述,但在一些情況下,這些額外的復雜性仍然比用大量三角形來描述物體更加廉價。這些圖元有一些相當古怪的名字:參數多項式(稱為樣條),非均勻有理B樣條(NURBs),貝塞爾曲線(Bezier),參數雙三次曲面和N-Patches。因為3D硬件對三角形理解得最好,這些在應用層定義的曲面會被柵格化,或者被轉換為三角形,轉換由API運行時,顯卡驅動或者硬件執行,以通過3D管線做進一步處理。如果曲面從CPU送入3D圖形卡做變換和光照處理時由硬件執行柵格化,性能還有可能進一步提升,但這會給AGP接口帶來少量負載,是一個潛在的瓶頸。
2.
幾何處理

繼續前進:四種主要變換
物體在幀與幀之間變化位置來產生運動的假象,在3D世界中,物體通過四種操作被移動和操作,統稱為變換。變換實際上是把不同類型的“變換矩陣”以矩陣數學作用在物體頂點上。這些變換操作都屬于仿射幾何(Affine),意味著它們發生在仿射空間中——一個包含點和向量的數學空間。仿射變換保留了線的平行關系,但點與點之間的距離可以變化。(看下面的例子,顯示了一個正方體變成了一個長方體,邊與邊的平行關系被保留下來,但物體內的角度發生了變化?)。當物體在一個特定的坐標系或空間中移動,或者從一個空間轉到另一個空間時使用這些變換操作。

平移:物體沿著三個坐標軸的任意一個到另一個位置的移動。數學操作:通常是加法或減法(加一個負數),不過為了提高效率做了一些轉換,所以這項操作通過矩陣乘法來完成,跟旋轉和縮放操作一樣。
旋轉:就像名字暗示的那樣,一個物體可以沿任意的軸旋轉。數學操作:最簡單的旋轉例子就是物體在坐標系的原點,頂點的每個坐標值乘上θ角(物體旋轉的角度)的sin或cos值就得到了旋轉后的坐標。如果一個物體要同時繞幾個坐標軸旋轉,旋轉的計算順序就非常重要,不同的順序會得到不同的結果。繞任意軸旋轉需要一些額外的工作。可能首先需要進行一個變換移動到原點,接著做一些旋轉操作使旋轉軸對齊坐標系的z軸。然后做想要的旋轉,然后對齊z軸的操作要被撤銷,然后把物體移回原位。
縮放:模型的大小變化,在透視投影(我們很快會詳細討論的一種變換)中用來產生場景深度效果。數學操作:乘一個縮放因子,如每個坐標乘2,物體會大一倍??s放可以被歸一化,這樣三個軸向的縮放比例相同,或者每個頂點做不同程度的縮放。負的縮放因子會產生物體的鏡像。
斜切:(又稱錯位變換)沿著一個或多個軸向操作使模型的形狀產生變化。例如一盒方形果凍盛在一個盤子里放在桌上,把盤子的一邊提起成45度,果凍因為重力會變成偏菱形。果凍模型的頂部會向著3D世界的地面歪斜。數學操作:把一個坐標值的函數加在另一個上,比如把x的值加在y上而x不變。
請看下圖:


就像前面所講,3D變換計算大量使用矩陣數學來描述。矩陣為變換條件提供了簡便的表示,3D矩陣數學通常是些簡單的乘法和加法。
變換處理的效率來自于以下事實:多次矩陣操作可以連接組成一個單獨的矩陣,把這個矩陣應用在頂點上作為一次單獨的矩陣操作。這就把矩陣操作的設置消耗分散到了整個場景中。有人可能會認為要給出使用笛卡爾坐標系的各種空間的三個坐標值,應該是個3x3的矩陣。然而這里用的是“齊次坐標”,是個4x4矩陣。使用齊次坐標可以把需要加法的變換用乘法來處理,比如平移。多個不同變換也可以通過齊次坐標連接為乘法運算。第四項實際上就是縮放因子“w”。最初設置為1,用來在裁剪空間中做投影變換時計算深度值,并且在光柵化階段作為像素值的透視修正插值。
從空間到空間
繼續進入到幾何圖元部分,我們很可能把物體從模型空間變換到世界空間,然后從世界空間到視圖空間,或者有些時候直接變換到視圖空間,我們前面提到過。從一個坐標空間轉換到另一個時,要用到許多基本的變換。有些可能像一個翻轉變換一樣簡單,也有復雜得多的,比如包括兩個平移和一個旋轉的組合。舉個例子,世界空間變換到視圖空間通常包括一個平移和一個旋轉。轉換到視圖空間之后,許多有趣的事情就開始發生了。
第一部分就講到這里。在下一部分我們將概括幾何圖元部分,并且涉及光照,裁剪,三角形設置以及渲染相關的許多方面。