1. 程式人生 > >[實時渲染] 2.3 幾何處理階段

[實時渲染] 2.3 幾何處理階段

direct 第五章 相交 關聯 觀察 可視化 一點 再次 art

? ? ?幾何處理階段的職責是逐多邊形和逐頂點操作,該階段被進一步分成例如以下幾個階段:模型視圖變換,頂點著色。投影,裁剪以及屏幕映射(圖2.3),再次強調一下。依據實現的不同,這些功能階段可能相當也可能不相當於管線階段,有時幾個連續的功能階段能夠合成一個管線階段(與其他管線並行地運行)。有時一個功能管線可能被分成幾個更小的管線階段。

? ? ? ? ?在極端情況下。在整個渲染管線中的全部階段能夠以軟件的形式運行一下處理器上。因此也能夠說整個管線僅僅包括一個管線階段。當然這也僅僅是在獨立加速芯片出現之前全部圖形的生成方式。

在另外一些極端情況下,每一個功能階段都能夠被劃分成幾個小的管線階段。每一個管線階段都運行在指定的處理核心上。

2.3.1 模型與視圖變換 ? ? ? ? ? ?在顯示到屏幕上的過程中,一個模型會被置換到幾個不同的坐標系中。最始一個模型屬於它的模型空間。這也意味著在該坐標系下模型無需變換。每一個模型都能夠被指定一下模型變換來指定位置和朝向。也能夠給一個模型指定多個不同的變換,這使得同樣模型的不同拷貝(實例)能夠不復制主要的幾何數據而在屏幕上具有不同的位置,朝向及尺寸。 ? ? ? ? ? ?模型變換的對象是模型的頂點和法線。一個對象的坐標系稱為模型坐標系,在模型系中通用模型變換後模型被放在了世界空間或者世界坐標系,世界空間是唯一的,經過與之相關的模型變換之後。全部模型都位於同樣的空間中。
? ? ?就像前面提到的,僅僅能被相機(觀察者)看到的模型才幹夠被渲染。相機在世界空間有位置與方向來放置與對準相機。為了進行投影及裁剪。相機和全部模型都被置換到視圖空間。視圖變換的目的是為了將相機放置在原點並對準它,來使它朝向z軸的負方向。y軸向上。x軸指向右方。視圖變換之後的真實位置取決底層API的實現。

這裏描寫敘述的空間稱為相機空間。通常也稱為眼睛空間。圖2.4顯示了經過視圖變換之後的相機與模型,模型變換與視圖變換都使用4x4的矩陣實現,這是第4章的主題。
2.3.2 頂點著色
? ? ?為了生成真實的場景,僅僅渲染物體的外形與位置是不夠的。它們的外表也須要被建模,這包括每一個物體的材質。每一個燈光照在物體上產生的效果,材質和燈光能夠使用不同的方式進行建模,從簡單的顏色到復雜的物理表現。 ? ? ?決定燈光在材質上表現效果的操作稱為著色(shading)。包括在物體的不同頂點上計算著色方程,典型地,某些計算在幾何階段作用在模型的頂點上,其他的可能發生在逐像素光柵化期間。每一個頂點都能夠存儲一些材質數據,如點的位置,法線,顏色以及其他計算著色方程須要的不論什麽數值信息。頂點著色的結果(可能是顏色,向量。紋理坐標以及其他類型的著色數據)被發送到光柵化階段進行插值。

? ? ?通常著色計算一般發生在世界空間中,實踐中,有時也非常方便將相關的實體(鏡頭,燈光)變換到其他空間來進行計算,這是實用,當參與著色計算的全部實體都被轉換到同一空間燈光。相機以及模型之間的相對關系得以保留。

? ? ?貫穿本書著色會被深入地討論,特別是在第三與第五章。
2.3.3 投影
? ? ?著色之後渲染系統運行投影,將觀察體置換到點(-1,-1,-1)到(1,1,1)的單位立方體內,單位立方體也稱為規則觀察體。有兩種經常使用的投影方法,各自是正交投影(也稱平行投影)和透視投影。如圖2.5。

? ? ?觀察體的正交視圖一般是一個矩形盒子,正交變換將觀察體轉換到一個觀察立方體,正交投影的主要特點是變換之後平行線依舊是平等的。正交變換是平移與放縮的組合。

? ? ? ? ? ?透視投影有一點復雜,在這樣的類型的投影中。投影之後遠離相機的物體看起來更小一點,另外。平行線在無限無處匯聚在一起。透視變換模仿我們觀察物體的尺寸。觀察體也稱為錐體。是一個被矩形截斷的角錐體(金字塔),該錐體也被轉換到單體立方體。正交和透視變換都能夠被構造成一個4X4的矩陣(見第四章),經過變換之後,模型也被稱為放在了規一化設備坐標系中。

? ? ? ? ? ?從一個體到還有一個矩陣變換被稱為投影,由於變換之後。z坐標是不會存儲在生成的圖像中的,經過投影模型從三維變成二維。
2.3.4 裁剪 ? ? ? ? ? ?僅僅有圖元全部或部分在觀察體才會被傳遞到光柵化階段。然後繪制在屏幕上。全部在觀察體內的圖元以原樣傳遞到下一個階段。完畢不在觀察體內的圖元既然不會被渲染也就不會再被往下傳遞了,部分在觀察體內的圖元須要裁剪。比如,一條線的一個頂點在觀察體內還有一個頂點觀察體外須要依據觀察體進行裁剪,所以觀察體外的那個頂點須要被該線與觀察體之間相交的點所取代。

投影矩陣的使用意味著使用單位立方體裁剪。

裁剪之前使用視圖變換的優勢在於使得裁剪問題變得一致,圖元的裁剪總是依靠單位立方體,圖2.6描寫敘述了裁剪的流程。除了觀察體的六個裁剪平面之外,用戶也能夠定義其他的裁剪平面來剔除物體。一張圖片顯示了這樣的類型的可視化,也稱為分片(sectioning),如圖14.1。

與之前典型地運行在GPU上幾何階段不同。裁剪階段(以及後面的屏幕映射階段)在特定的硬件上運行。
2.3.5 屏幕映射
? ? ?僅僅有觀察體中(被裁剪過)的圖元才被傳遞到屏幕映射階段。當圖元進入該階段時也依舊是三維的,每一個圖元的x和y坐標被置換成屏幕坐標,屏幕坐標與z坐標組成了窗體坐標。如果場景被渲染到的窗體的最小角在 和最大角是 ,當中 ,然後變換之後接下來是縮放操作。

z坐標不受映射的影響,x和y坐標被稱為屏幕坐標,xy與z 坐標被傳遞到光柵化階段,屏幕映射的過程如圖2.7所看到的。
? ? ?一個令人迷惑的是整型和浮點數是怎樣關聯到像素(紋理)坐標。DirectX 9及其前代使用0.0作為像素中心的坐標系統。意味著[0,9]的像素範圍覆蓋的範圍是[-0.5, 0.95)。

Heckbert[520]描寫敘述了一個更一致的策略,給定一個使用笛卡爾坐標系水平像素數組。像素最左邊緣是浮點數0.0,OpenGL,DirectX10及後代使用這樣的策略,該像素的中心點是0.5,所以[0,9]的像素覆蓋的範圍是[0.0, 10.0),這個轉換可簡單地表述為: 當中d是像素的離散(整型)索引。c是像素內的連續浮點數。
? ? 對全部API來說像素位置增長都是從左到右。 而位置0是在頂部還是底部OpenGL和DirectX是不一樣的。OpenGL使用笛卡爾坐標系以左下角作為最小值。而DirectX有時依據上下文的不同以左上角作為最小值。他們都是有道理的,之間的區別並無對錯。舉個樣例,(0,0)在OpenGL中位於圖片的左下角,在DirectX中位於圖片的左上角,DirectX的原因是由於屏幕上的一些現象是從頂究竟的,微軟窗體使用這樣坐標系統。我們閱讀也是這個方向。而且非常多圖片格式也是以這樣的方式存儲緩存區。關鍵的問題是兩者區別的存在,而且當轉換API時須要考慮到這一點。

?????


















[實時渲染] 2.3 幾何處理階段