必威电竞|足球世界杯竞猜平台

柵格化
來源:互聯(lián)網(wǎng)

柵(shan)格化,是PS中的一個專業(yè)術(shù)語,柵格即像素,柵格化即將矢量圖形轉(zhuǎn)化為位圖(柵格圖像)。最基礎(chǔ)的柵格化算法將多邊形表示的三維場景渲染到二維表面。

綜述

總體上來講,柵(shan,多音字在PS等專業(yè)軟件里讀作shan,柵格即為像素)格化這個術(shù)語可以用于任何將【矢量圖形】轉(zhuǎn)換成【位圖|柵格圖像】的過程。

在通常的應(yīng)用中,這個術(shù)語用來表示在計算機(jī)上顯示三維形狀的流行[[渲染]]算法。柵格化目前是生成實時[[三維計算機(jī)圖形]]最流行的算法。實時應(yīng)用需要立即響應(yīng)用戶輸入,并且通常需要至少每秒 24 幀的速率

與【輻射著色】、【光線跟蹤】等其它渲染技術(shù)不同,柵格化的速度非常快,但是由于它不是根據(jù)光傳輸?shù)奈锢硪?guī)律進(jìn)行處理的,所以無法正確模擬許多復(fù)雜真實光照環(huán)境。

基本實現(xiàn)方法

最基礎(chǔ)的柵格化算法將多邊形表示的三維場景渲染到二維表面。多邊形由三角形的集合表示,三角形由三維空間中的三個頂點表示。在最簡單的實現(xiàn)形式中,柵格化工具將頂點數(shù)據(jù)映射到觀察者顯示器上對應(yīng)的二維坐標(biāo)點,然后對變換出的二維三角形進(jìn)行合適的填充。

變換

通常使用矩陣運算進(jìn)行變換,另外也可以用四元數(shù)運算但那不是本文討論的范圍。在三維頂點中添加一個齊次變量成為四維定點然后左乘一個 4 x 4 的變換矩陣,通過這種方法就可以對三維頂點進(jìn)行變換。主要的變換有平移、縮放、旋轉(zhuǎn)以及投射。

平移變換是點在三維空間中從一點移動到固定偏移的另外一點的過程,平移可以用下面的矩陣表示:

X、Y 與 Z 分別是三維空間中的偏移。

縮放變換通過在頂點位置上乘以一個標(biāo)量值實現(xiàn),這樣就將頂點相對于原點的位置進(jìn)行縮放。縮放變換可以用下面的矩陣表示:

其中 X、Y 與 Z 是三維坐標(biāo)中每一維所乘的數(shù)值。通過使用不同的 X、Y、Z 值可以實現(xiàn)不對稱縮放。

旋轉(zhuǎn)變換是繞著一個軸線對每點進(jìn)行旋轉(zhuǎn)。

繞 X 軸旋轉(zhuǎn):

繞 Y 軸旋轉(zhuǎn):

繞 Z 軸旋轉(zhuǎn):

其中 θ 表示旋轉(zhuǎn)角度。

邏輯上一系列的平移、縮放、旋轉(zhuǎn)可以表示絕大多數(shù)的變換。通常柵格化系統(tǒng)使用變換棧將輸入頂點的數(shù)據(jù)流變換到指定位置,變換棧是保存矩陣的標(biāo)準(zhǔn)堆棧,輸入頂點與矩陣棧相乘進(jìn)行變換。

為了說明如何使用變換棧,我們假設(shè)有一個簡單場景中只有一個人的模型。這個人在一個特定位置面向任意一個角度豎直站立,頭轉(zhuǎn)向另外一個方向。使用一系列的頂點與模型用來表示這個人物。首先,將一個變換矩陣壓到堆棧中將模型移到正確的位置;其次,將縮放矩陣壓到堆棧中將模型縮放到正確的尺寸;然后,表示身體的頂點數(shù)據(jù)流送到柵格化工具中;由于頭部面向另外一個方向,將旋轉(zhuǎn)矩陣從堆棧彈出,壓入一個繞 Y 軸旋轉(zhuǎn)一個不同角度的旋轉(zhuǎn)矩陣;最后,表示頭部的頂點數(shù)據(jù)流送到柵格化工具。

在所有點都已經(jīng)變換到相對于觀察者的合適三維空間位置之后,就需要將它們變換到二維空間了。最簡單的投影方法正投影簡單地從變換的三維頂點中扔掉 Z 分量。正投影的特點是三維空間中的平行線在二維表示中仍然平行。但是,真實世界中的圖像都是透視圖像,離觀察者較遠(yuǎn)的點之間的距離看起來要比較近點之間的距離近,這些點都要進(jìn)行透視投影變換。

從概念上來講就是將透視體轉(zhuǎn)變成正視體。透視體是平截頭體,即被截去頭部的埃及金字塔體。正視體是一個矩形盒,其中遠(yuǎn)近兩個觀察面都與圖像平面平行。

透視投影變換可以用下面的矩陣表示:

其中 F 與 N 分別是觀察面的遠(yuǎn)近距離。四個結(jié)果向量是一個齊次變量不是 1 的向量。對向量進(jìn)行齊次變換,或者乘以齊次變量的逆,齊次變量變?yōu)?a href="/hebeideji/1752845219371155552.html">單位矩陣,這就是最終二維位置的 x 與 y 坐標(biāo)。

裁剪

一旦三角形頂點轉(zhuǎn)換到正確的二維位置之后,這些位置可能位于觀察窗口之外,也可能位于屏幕之內(nèi)。裁剪就是對三角形進(jìn)行處理以適合顯示區(qū)域的過程。

最常用的技術(shù)是Sutherland-Hodgeman裁剪算法。在這種方法中,每次測試每個圖像平面的四條邊,對于每個邊測試每個待渲染的點。如果該點位于邊界之外,就剔除該點。對于與圖像平面的邊相交的三角形邊,即邊的一個頂點位于圖像內(nèi)部一個位于外部,那么就在交叉點插入一個點并且移除外部的點。

掃描變換

傳統(tǒng)的柵格化過程的最后一步就是填充圖像平面中的二維三角形,這個過程就是掃描變換。

第一個需要考慮的問題就是是否需要繪制給定的像素。一個需要渲染的像素必須位于三角形內(nèi)部、必須未被裁掉,并且必須未被其它像素遮擋。有許多算法可以用于在三角形內(nèi)進(jìn)行填充,其中最流行的方法是掃描線算法。

由于很難確定柵格化引擎是否會從前到后繪制所有像素,因此必須要有一些方法來確保離觀察者較近的像素不會被較遠(yuǎn)的像素所覆蓋。最為常用的一種方法是深度緩存,深度緩存是一個與圖像平面對應(yīng)的保存每個像素深度的二維數(shù)組。每個像素進(jìn)行繪制的時候都要更新深度CPU緩存中的深度值,每個新像素在繪制之前都要檢查深度緩存中的深度值,距離觀察者較近的像素就會繪制,而距離較遠(yuǎn)的都被舍棄。

為了確定像素顏色,需要進(jìn)行紋理或者濃淡效果計算。紋理圖是用于定義三角形顯示外觀的位圖。每個三角形頂點除了位置坐標(biāo)之外都與紋理以及二維紋理坐標(biāo) (u,v) 發(fā)生關(guān)聯(lián)。每次渲染三角形中的像素的時候,都必須在紋理中找到對應(yīng)的紋素,這是根據(jù)在屏幕上像素與頂點的距離在與紋理坐標(biāo)相關(guān)聯(lián)的三角形頂點之間插值完成的。在透視投影中,插值是在根據(jù)頂點深度分開的紋理坐標(biāo)上進(jìn)行的,這樣做就可以避免透視縮減(perspective foreshortening)問題。

在確定像素最終顏色之前,必須根據(jù)場景中的所有光源計算像素上的光照。在場景中通常有三種類型的光源。定向光是在場景中按照一個固定方向傳輸并且強(qiáng)度保持不變的光。在現(xiàn)實生活中,由于太陽距離遙遠(yuǎn)所以在地球上的觀察者看來是平行光線并且其衰減微乎其微,所以太陽光可以看作是定向光。點光源是從空間中明確位置向所有方向發(fā)射光線的光源。在遠(yuǎn)距離的物體上的單射光線會有衰減。最后一種是光束燈,如同現(xiàn)實生活中的聚光燈一樣,它有一個明確的空間位置、方向以及光錐的角度。另外,經(jīng)常在光照計算完成之后添加一個環(huán)境光值以補(bǔ)償光柵化無法正確計算的全局照明效果。

有許多可以用于光柵化的濃淡算法。所有的濃淡處理算法都必須考慮與光源的距離以及遮蔽物體法向量與光照入射角。最快的算法讓三角形中的所有像素使用同樣的亮度,但是這種方法無法生成平滑效果的表面。另外也可以單獨計算頂點的亮度,然后繪制內(nèi)部像素的時候?qū)旤c亮度進(jìn)行插值。速度最慢也最為真實的實現(xiàn)方法是單獨計算每點的亮度。常用的濃淡模型有?Gouraud shading?和 Phong shading。

加速技術(shù)

為了在任何柵格化引擎中獲得最大的性能,只能往渲染工具中發(fā)送最少數(shù)量的多邊形。人們已經(jīng)開發(fā)出了一些加速技術(shù)以剔除無法看到的物體。

后向剔除

最簡單的剔除多邊形的方法就是剔除所有背離觀察者的多邊形,這就是后向剔除。由于大多數(shù)三維物體都是封閉的,所以除非觀察者位于物體內(nèi)部,背離觀察者的多邊形都會被面向觀察者的多邊形所遮擋。多邊形的方向由它的 旋繞方向(繞組)或者送到渲染工具的頂點順序所確定。一旦多邊形變換到屏幕空間之后,就可以檢查它是否位于相反的方向,一旦如此就丟棄這個多邊形。當(dāng)然,后向剔除不適合于簡并的不封閉立體。

空間數(shù)據(jù)結(jié)構(gòu)

許多先進(jìn)的技術(shù)使用數(shù)據(jù)結(jié)構(gòu)提出觀察物體之外的物體或者被其它物體遮擋的物體,最為常用的數(shù)據(jù)結(jié)構(gòu)有二元空間分割、八叉樹以及 Cell and Portal Culling。

進(jìn)一步改進(jìn)

盡管基本的柵格化過程已經(jīng)出現(xiàn)了數(shù)十年,許多當(dāng)今的應(yīng)用仍然在優(yōu)化、增加?xùn)鸥窕秩疽娴膽?yīng)用范圍。

紋理映射

紋理是在特定的分辨率生成的,但是由于紋理覆蓋的表面與觀察者之間可能是任意的距離,所以紋理也可能最后圖像上有任意的尺寸。因此,屏幕上的一個像素通常并不直接對應(yīng)于一個紋素,而是需要使用一些紋理濾波技術(shù)來生成任意距離的清晰圖像。有許多在圖像質(zhì)量與計算的復(fù)雜性進(jìn)行不同這種考慮的方法可以完成這項工作。

環(huán)境映射

環(huán)境映射是紋理坐標(biāo)與觀察點相關(guān)的紋理映射形式。例如,其中一個常用的應(yīng)用程序就是用來模擬鏡面反射,我們可以將整個房間內(nèi)部環(huán)境映射到房間內(nèi)的一個金屬杯上,當(dāng)觀察者沿著杯子移動的時候,杯子頂點的紋理坐標(biāo)也隨之變化,這樣就得到反射效果。

凸凹紋理映射

凸凹紋理映射是改變像素深度而不是顏色的另外一種紋理映射形式。尤其是與最新的陰影工具一起使用的時候,凸凹紋理映射使得表面顯現(xiàn)出與光照有關(guān)的凸凹不平,從而大幅度地提高真實感。

細(xì)節(jié)層次

在許多當(dāng)今的應(yīng)用中,任何場景中的多邊形數(shù)目都是非常大的,但是場景中的觀察者只能區(qū)分近距物體的細(xì)節(jié)。細(xì)節(jié)層次算法根據(jù)物體與觀察者的距離改變幾何圖形的復(fù)雜性。正對著觀察者的物體需要進(jìn)行非常復(fù)雜的渲染,而距離遠(yuǎn)的物體可以動態(tài)地簡化,甚至可以完全適用二維 sprite 替代。

陰影

傳統(tǒng)柵格化過程的光照計算沒有考慮物體遮擋的因素。陰影圖與陰影體是當(dāng)今兩種生成陰影的普通技術(shù)。

硬件加速

從1990年代開始,用于消費型桌面電腦的硬件加速開始變得普通。圖形程序員早期依賴于手工編寫匯編程序以改善程序的運行速度,現(xiàn)在大多數(shù)的程序已經(jīng)使用現(xiàn)有的圖形 API 驅(qū)動專用的圖形處理器

最新的圖形處理器帶有可編程的 pixel shader,這可以大幅度地提升程序員的能力。未來的發(fā)展趨勢就是完全可編程的圖形流水線

參考資料 >

生活家百科家居網(wǎng)