前言:
在之前的文章中,我們補充了影象繪製管線的三個階段:應用程式階段、幾何階段和光柵階段,其中幾何階段和光柵階段使我們理解繪製過程的重點,在這裡我們需要著重分析一下這兩個過程。
光柵階段
一、難點解決:
光柵化(resterization),決定哪些畫素被幾何圖元覆蓋的過程。在之前的幾何階段完成後,我們得到了每個點的螢幕座標值,也知道了需要繪製的圖元(點、線、面)。但是,在實現光柵化之前,我們需要先解決兩個重要的問題:
1.點的螢幕座標值是浮點數,但畫素都是由整數點來表示的,如果確定螢幕座標值所對應的畫素?
解決方案:繪製的位置只能接近兩指定端點間的實際線段位置(
就近原則,取整法
)例如,一條線段的位置是(10.48,20.51) ,轉換為畫素位置則是(10,21)。
2.在螢幕上需要繪製的有點、線、面,如何根據兩個已經確定位置的2 個畫素點繪製一條線段,如果根據已經確定了位置的 3 個畫素點繪製乙個三角形麵片?
解決方案:要解決這個問題,設計到了
畫線演算法
和區域圖元的填充演算法
,例如:
畫線演算法:dda演算法、bresenham畫線演算法
區域圖元填充演算法:掃瞄線多邊形填充演算法、邊界填充演算法等。
二、畫素處理(pixel operation):
解決了上述兩個問題,我們的頂點(vertex)以及繪製圖元(線、面)已經對應到畫素(pixel)。那麼,接下來我們就需要進行畫素處理——給畫素設定顏色值。
pixel operation也稱為raster operation,是在更新幀快取之前,執行最後一系列針對每個片段的操作,其目的就是:計算出每個畫素的顏色值。在這個操作過程中,被遮擋面通過乙個被稱為
深度測試
的過程剔除掉。那麼,pixel operation所包含的所有步驟有:
1.消除遮擋面:通過深度檢測剔除;
2.紋理操作(texture operation):根據畫素的紋理座標,查詢對應的紋理值;
3.混色(blending):
根據目前已經畫好的顏色,與正在計算的顏色的透明度(alpha),混合為兩種顏色,做新的顏色輸出
,常稱為
alpha混合技術
。每個畫素固有的屬性:rgb顏色值、z緩衝器深度值和alpha(透明度)值。
4.過濾(filtering):將當前正在計算的顏色值,通過某種filtering(濾波或者濾鏡)後輸出,簡單的解釋就是
對當前計算的顏色值進行一次數**算得到新的顏色值
。三、後續步驟:
完成了光柵化之後的顏色值,會被寫入到
幀快取
四、常見的快取區:
1.z buffer和z值:
有稱為depth buffer,即
深度緩衝區
,用於存放視點到每個畫素對應的空間點的距離權衡之,稱為z值或者深度值。z值範圍為【0,1】,最近的為0.0,最遠的為1.0。通過z buffer可以判斷空間點的遮擋關係,例如深度緩衝區演算法就是對投影平面上每個畫素所對應的z值進行比較;
2.stencil buffer:模板緩衝區,是乙個額外的buffer,用來「做記號」的buffer,通常附加到z buffer,每個畫素對應乙個stencil buffer。z buffer和stencil buffer通常在視訊記憶體中共享一片區域;
3.frame buffer:
幀緩衝器
,用於存放顯示輸出的資料,這個buffer中的資料一般是畫素顏色值。
五、其他:
繪製管線資料推薦: blinn 的《 a trip down the graphics pineline 》
UnityShader 挺進體積光
原本是想找找體積霧的,無意中發現了 gpu gems 3上的一篇螢幕特效實現體積光散射的文章,實現了一波發現文章裡公式列的很高大上,結果具體實現卻出乎意料的簡單,只是通過畫素的螢幕位置和光源的螢幕位置計算光線方向,然後在乙個迴圈中沿光線方向將上乙個畫素的顏色衰減後疊加到下乙個畫素,具體可參考 gpu...
UnityShader例項03 邊緣光材質
邊緣光材質 邊緣光材質原理和xray材質相類似,shader 也就長得幾乎一樣了 shader 實現 vf版本 01 shader penglu rimlight vf rimcolor rimcolor color 0,1,1,1 rimpower rim power range 0.1,8.0 ...
Unity Shader 自定義Phong光照
今天我們來學習一下怎麼在unity裡實現自定義phong光照模型 什麼是phong光照?環境光和漫反射光比較容易計算,那鏡面高光要如何計算呢?鏡面高光其實可以通過利用入射光方向 即光照方向的反方向 和法線計算出反射光方向,然後再通過反射光方向和觀察視角方向計算出實際進入眼睛的光照強度,然後再做乙個光...