unity 渲染流程
阿新 • • 發佈:2019-02-06
Device的使用者要準備好頂點資料,也就是一個頂點的陣列A。傳入device的渲染管線
座標變換
objectvector 本地座標 模型座標
x
viewmatrix 世界座標 view矩陣
x
projective matrix 視口(裁剪空間) 透視矩陣 or
orthogonal matrix 正交矩陣
然後除以頂點w分量透視除法 正交矩陣已經是一個立方體了 w分量=1 透視除法不會對頂點產生影響
用
齊次除法
vector4中w分量是用來區分 是否要透視除法的
然後除以頂點w分量透視除法 這樣就從視錐變成裡一個立方體 得到螢幕空間
用處 判斷頂點是否在視錐內
透視矩陣後 的vector4 用 -w<= x,y,z <=w 來判斷是否在視錐內
opengl裡 是【-1,1】的值 directx裡z分量範圍是 0,1
unity用的opengl的 這套
從裁剪空間到螢幕空間是底層幫助完成的
得到新的頂點資料
處理掉渲染的頂點
頂點被組織成一個個三角形,然後對這些三角形進行裁剪(利用頂點資料裡包含的那一個透視空間的位置),
背面剔除(注意背面剔除和頂點的法線是沒關係的)
處理後
螢幕空間
這樣就從視錐變成裡一個立方體
unity螢幕空間 左下角是0
cg cpos是hlsl對螢幕座標的語意 wpos 是cg對螢幕座標的語意
dx10以後 畫素座標的中心被定為0.5
光柵化
對資料中每一個三角形,在螢幕空間找出它們在螢幕上覆蓋的畫素 (一個三角形覆蓋的畫素的數量有可能是很多的),對於每一個畫素,
根據它在三角形中的位置,通過三角形的頂點進行線性插值,計算出一個畫素資料(注意畫素 資料是通過三角形的頂點資料插值而來,
所以它們的資料型別是一致的,在這個階段裡,三角形的數 組變成了畫素資料陣列)
stencil test
(根據stencilbuffer上的值)和z-test(根據這個畫素的Z值和z-buffer上的值進行比較),根據測試結果會對stencil buffer進行一些修改
(使用一組render state來控制這個過程)
pixel shader
device對每個畫素資料進行處理
alpha test
(根據畫素的alpha 值),alpha test是最後一個test了,通過了alpha test的畫素可以保證繪製到螢幕上去,通過test的畫素會把它們的z值
更新到z-buffer中去(具體由一組render state控制),通過test的畫素被存入陣列G
混合
把算出來的畫面顏色資料和螢幕上已有的畫素進行混合,具體混合的方式有多種多樣,由一系列render state進行控制.混合以後的畫素就被
"畫"到螢幕上了