渲染流水線能夠簡單分爲3個階段即應用階段、幾何階段、光柵化階段。應用階段是由CPU來完成的,而幾何階段和光柵化階段是由GPU來完成。對於後兩個階段,GPU經過實現流水線化,大大加快了渲染速度,咱們沒法徹底控制這兩個階段的實現細節,可是GPU向開發者開放了不少控制權。下圖展現了流水線的具體流程:編程
GPU的渲染流水線接收頂點數據做爲輸入,這些頂點數據是由CPU控制的應用階段加載到顯存中,再由DrawCall指定。網絡
頂點着色器(Vertex Shader):是徹底可編程的,它一般用於實現頂點的空間變換,頂點着色等功能app
曲面細分着色器(Tessellation Shader):可選着色器,用於細分圖元函數
幾何着色器(Geometry Shader):可選着色器,用於執行逐圖元着色操做,或用於產生更多的圖元測試
剪裁(Clipping):能夠配置但不可編程,裁剪掉不在攝像機視野的頂點,並剔除某些三角圖元的面片。spa
屏幕映射(Screen Mapping):不可配置和編程,負責把每一個圖元座標轉換到屏幕座標系中。orm
三角形設置(Triangle Setup)和三角遍歷(Triangle Traversal):固定函數階段blog
片元着色器(Fragment Shader):徹底可編程,用於實現逐片元的着色操做ip
逐片元操做(Per-Fragment Operations):不可編程,但具備很高的可配置性 負責執行不少操做,例如修改顏色、深度緩衝、進行混合。ci
頂點着色器自己不能夠建立或者銷燬任何頂點,並且沒法的到頂點與頂點之間的關係。這種相互獨立性使得GPU能夠並行化處理每個頂點, 這意味着這一階段處理速度會很快。
頂點着色器除了座標變換和逐頂點光照這兩個主要任務外,還能夠輸出後續階段所需的數據
頂點着色器有不一樣的輸出方式,最多見的是經光柵化後交給片元着色器進行處理,在現代 Shader Model 中,它還能夠把數據發送給曲面細分着色器和幾何着色器
一個最基本的頂點着色器必須完成的工做是把頂點座標從模型空間轉換到齊次剪裁空間,常見代碼爲:(o.pos = mul(UNITY_MVP,v.position)),接着再由硬件作透視除法,最終獲得歸一化設備座標(Normalized Device Coordinate,NDC)值在[-1,1]之間。咱們能夠經過改變頂點的位置來模擬水面、布料等。
一個圖元若是部分在視野內須要通過剪裁,方法是講視野外的頂點由視野內的頂點代替。這一步是硬件上的固定操做,咱們能夠經過自定義剪裁操做來對這一步進行配置。
把每一個圖元的x和y座標轉換到屏幕座標系,因爲咱們輸入的座標值在-1到1之間,因此這個過程其實是一個縮放的過程,注意屏幕映射不會對z座標作任何處理。屏幕座標系和z座標一塊兒構成窗口座標系,屏幕映射獲得的屏幕座標決定了頂點對應屏幕上的哪一個像素以及距離這個像素有多遠。
計算光柵化一個三角網絡所需的信息(一個計算三角網格表示數據的過程)
根據上一個階段的計算結果來判斷一個三角形覆蓋了哪些像素,並使用網格3個頂點的頂點信息對整個覆蓋區域的像素進行插值。最後輸出一個片元(fragment)序列,這個階段也被稱爲掃描變換(Scan Conversion)。
一個片元並非真正意義上的像素,它包含了不少狀態集合(屏幕座標、深度信息、頂點信息),這些狀態用於計算每一個像素的最終顏色。
又稱像素着色器(Pixel Shader),片元着色器的輸入是上一個階段對頂點信息插值獲得的結果,這一階段完成不少重要的渲染技術,其中最重要的技術是紋理採樣。
又稱輸出合併階段(Output-Merger)
這一階段有幾個主要任務。
(1)決定每一個片元的可見性。這會涉及不少測試工做,好比深度測試、模板測試
(2)若是一個片元經過的全部測試,就須要把這個片元的顏色值和已經存儲在顏色緩衝區的顏色進行合併,或者說是混合。
若是開啓了模板測試,GPU會首先讀取(使用讀取掩碼)模板緩衝區中該片元位置的模板值而後將該值和讀取(使用掩碼讀取)到的參考值(reference value)進行比較,開發者能夠指定該比較函數,例如小於時捨棄該片元,或者大於時捨棄該片元。若是該片元沒有經過測試,該片元就會被捨棄。無論一個片元有沒有經過測試,開發者均可以根據模板測試和深度測試來修改模板緩衝區。另外,模板測試還有一些高級用法,如渲染陰影、輪廓渲染等
片元經過模板測試後就會進行深度測試,若是開啓了深度測試,GPU會把該片元的深度值和已經存在於深度緩衝區中的深度值進行比較。和模板測試同樣,開發者能夠指定該函數。和模板測試不一樣的是,若是一個片元沒有經過深度測試,它就沒有權利修改深度緩衝區的值。若是經過了測試,開發者還能夠指定是否要用這個片元的深度值覆蓋掉原有的深度值。
該過程主要針對透明的物體,對於不透明的物體能夠關閉混合。是當前獲得的顏色信息與顏色緩衝區中的信息的混合。開發者能夠選擇開啓和關閉混合功能,關閉後就會直接使用片元的顏色覆蓋掉緩衝區的顏色。
當模型的圖元通過上面的層層計算和測試後,就會顯示到屏幕上。咱們屏幕顯示的就是顏色緩衝區的顏色值,爲了保證咱們看到的圖像是連續的,GPU會使用雙重緩衝的策略,對場景的渲染在後置緩衝中(Back Buffer),一旦場景已經被渲染到了後置緩衝中,GPU就會交換後置緩衝和前置緩衝(Front Buffer)中的內容。