實時渲染 2 4 光柵化階段

2021-07-11 02:54:38 字數 2441 閱讀 3370

給定變換和投影過的頂點以及相關的著色資料(來自幾何階段),光柵化階段的目的是計算並設定被物體覆蓋的畫素的顏色,該過程也稱為光柵化或掃瞄轉換(scan conversion),是將螢幕空間帶z值(深度值)的二維頂點及其相關的各種著色資訊轉換到螢幕上的畫素。

如幾何階段相似,該階段也被分成幾個功能階段:三角形設定,三角形遍歷,畫素著色,混合,如圖2.8所示。

2.4.1 三角形設定

三角形表面的微分和其它資料在該階段進行計算,該資料用來進行掃瞄轉換,以及對幾何階段生成的各種著色資料進行外掛程式。該階段使用固定功能的使用進行處理。

2.4.2 三角形遍歷

該階段檢查每個畫素中心(取樣)是否被三角形覆蓋,並為畫素的其它部分生成乙個與三角形重疊的片元(fragment),找到三角形內的取樣或畫素稱為三角形遍歷或掃瞄轉換。每個三角形片元的屬性使用三個頂點間插值得到的資料進行生成(見第五),這些屬性包括片元的深度,以及由幾何階段生成的任何著色資料。akeyley,jermoluk[7]以及rogers[1077]提供了更多關於三角形遍歷的資訊。

2.4.3 畫素著色

任何逐畫素著色的計算都是在該階段執行,使用插值過的著色資料作為輸入,結果是乙個或多個顏色被傳遞到下乙個階段,與三角形設定與遍歷使用專用硬體不同,畫素著色階段在可程式設計的gpu核心上執行,大量不同的技術被應用在這裡,其中乙個最重要的技術是貼圖(texturing),貼圖在第六章會更深入研究。簡單地說,給乙個物體貼圖意思是說將乙個粘到物體上,圖2.9詳細描述了這個過程。最常用的可以是1維,2維和3維的

2.4.4 混合

每個畫素的資訊儲存在顏色緩衝區(color buffer)中,緩衝區是乙個矩形的顏色陣列(紅,綠和藍三個分量),混合階段的責任是聯合著色階段產生的片元顏色與當前緩衝區中的顏色。與著色階段不同,gpu的子單元通常執行的這一步不是完全可程式設計的,但是是高度可配置的以達到不同的效果。

該階段也負責處理可見性,這是說當整個整個場景被渲染後,顏色緩衝區中應當包含場景中從相機位置可以看到的圖元的顏色。對大多數的圖形硬體,這一階段使用z-buff演算法[162],z-buff是乙個與顏色緩衝區形狀大小相同的緩衝區,每個畫素儲存相機到當前最近圖元的z值,這是說當乙個圖元被渲染到乙個特定的畫素,該圖元在該畫素的z值被計算並與z-buff中的值進行比較,如果新的z值比z-buffer中的值小,由於該圖元在該畫素更接近相機所以會被渲染,因此該畫素的z值和顏色會使用被繪製的圖元的z值和顏色進行更新,如果計算得到的z值大於z-buffer中的值,顏色緩衝區和z-buffer保持不變。z-buffer演算法非常簡單,具有o(n)的收斂性(n是被渲染的圖元數量),並且對任何能給相關畫素生成z值的圖元都是有效的。同時注意,該演算法允許大部分的圖元可以以任何順序進行渲染,這也是該演算法流行的另乙個原因,然而對於部分透明的圖元不可以僅僅使用任何順序,他們必須在不透明體渲染之後,並且使用從後向前進行渲染(5.7節),這是z-buffer的乙個主要缺點。

我們已經提到顏色緩衝區和z-buffer用來儲存每個畫素的顏色和z值,另外還有其它的通道和緩衝區用來過濾和捕捉片元資訊,alpha通道是被指定到顏色緩衝區用來儲存每個畫素的透明度(見5.7節),乙個片元上可選的alpha測試(alpha test)可以在深度測試之前執行,片元的alpha值可以與參考值進行指定的測試(等於,大於等),如果片元測試失敗,將被從後續的處理中移除,該測試通常用於保證完全透明的片元不會影響到z-buffer(見6.6節)。

模板快取(stencil buffer)是乙個離屏的緩衝區用來記錄被渲染圖元的位置,通常每個畫素包含8個bit,圖元可以使用不同的方法(function)來渲染到模板快取,該快取的內容然後可以用來控制渲染到顏色緩衝區和z-buffer。舉個例子,假設乙個實心圓已經被繪製到模組快取,可以聯合使用乙個操作允許渲染後續圖元到只有圓顯示的顏色緩衝區上,模板快取是生成特殊效果的有力工具,所有這些操作在圖元的結尾稱為光柵操作(raster operations, rop)或融合操作。

幀快取(frame buffer)通常指乙個系統上的所有緩衝區,不過有時僅僅值乙個包含顏色緩衝區及z-buffer的集合,2023年haeberli和akeley[474]提出了乙個幀快取的補充,稱為累積緩衝區(accumulation buffer),在該緩衝區中影象可以使用乙個操作集合進行累積,例如,乙個影象集合顯示乙個運動中的物體可以被累加和平均來生成運動模糊,其它可以生成效果包括景深(dof),抗鋸齒(antialiasing),軟陰影等等。

當圖元到達光柵化階段,這些從相機視點可見的圖元會被顯示在螢幕上,螢幕顯示了顏色緩衝區中的內容。為了避免人類觀察都看到正在被光柵化以及傳送到螢幕上的圖元,雙緩衝區(double buffering)被使用,這也即是說場景的渲染發生在離屏的後緩衝區(back buffer)中,一旦場景在後緩衝區中渲染完成,後緩衝區的內容與之前正在螢幕上顯示的前緩衝區(front buffer)中內容進行交換,交換發生在乙個可以安全執行的垂直回掃(vertical retrace)時間裡。

更多關於不同的緩衝區及快取技術見5.6.2和18.1節

軟體光柵化渲染器 六

加入了透視矯正,畫素的覆蓋遵循了左上的原則。對1 z進行插值,將結果在除以1 z得到正確的插值。透視矯正紋理 void fillbottom bytexcorrect const t else if t.vertex 1 newpos y t.vertex 2 newpos y else if le...

軟體光柵化渲染器 十

環境光,一般場景中只有乙個環境光源 環境光 class light 定向光源,方向一定,並且光不會衰減 方向光源 class directionlight public light 計算鏡面高光 l direction double x l.x 2 vectordot l,vertex.normal...

Xcode實時渲染 IBDesignable

當應用到 uiview 或 nsview 子類中的時候,ibdesignable 讓 inte ce builder 知道它應該在畫布上直接渲染檢視。你會看到你的自定義檢視在每次更改後不必編譯並執行你的應用程式就會顯示。其中ibdesignable中的ib是inte ce builder 的縮寫。標...