在光柵階段,除了要通過片斷著色程式(OpenGL叫法)著色外,還需要進行裁剪測驗、Alpha測驗、模板測驗、深度測驗、混合操作,這些操作在OpenGL、D3D、Vulkan等操作順序不盡相同,在軟體渲染器,片斷著色程式是渲染管線的瓶頸所在,因此這里的光柵化之后流程如下,這里的橙色部分任意一條執行失敗,都不會繼續執行后面操作,

裁剪測驗:用來表示繪制程序定義的一個矩形區域,只有位于這個區域內的像素才會被最侄訓制,
模板測驗:模板測驗用到了模板緩沖區,可以實作各種特效,有些陰影演算法會用到模板,模板緩沖區可進行讀寫操作,使用啟用測驗時,首先設定一個參考值和Mask值,在模板測驗階段對當前像素模板緩沖區中的值與Mask按位與后和設定的參考值進行比較,得到比較結果后對模板緩沖區當前像素值執行一些操作,比較結果通過時,繼續執行下個階段,這里的比較操作包含:
never:比較結果總是回傳false,
always:比較結果總是回傳true,
equal:模板值與參考值相等回傳true,否則回傳false,
not equal:模板值與參考值不等回傳true,否則回傳false,
less than:模板值小于參考值回傳true,否則回傳false,
less or equal:模板值小于等于參考值回傳true,否則回傳false,
greater than:模板值大于參考值回傳true,否則回傳false,
greater or equal:模板值大于等于參考值回傳true,否則回傳false,
對模板值的操作分為三種情況,分別為模板測驗不同過,深度測驗不通過和模板測驗與深度測驗均通過,針對這三種情況,模板值可進行以下操作:
zero:將模板緩沖區的值置為0,
keep:保持當前模板緩沖區中的數值不變,
replace:參考值替換模板緩沖區中的值,
invert:模板緩沖區的值按位取反,
increment:當前模板緩沖區的值小于最大模板值,則模板值加1,
decrement:當前模板緩沖區的值大于0,則模板值減1,
深度測驗:深度測驗用到了深度緩沖區,即zbuffer,在光柵化時得到的當前待繪制點的1/z值與緩沖區中的值進行比較,如果通過測驗,則寫深度值,并繼續執行下一個操作,這里比較操作與上面模板比較操作相同,這里所以是1/z,是因為前面提到通過透視投影后,z值遇到到[-1,1]區間是非線性的,如果使用z值進行深度測驗,將造成攝像機遠處的很大范圍深度值映射于很小的范圍內,從而導致精度缺失,從1/z是線性的,儲存1/z則可以解決這個問題,
Alpha測驗:著色Alpha值與設定的值進行比較,只有滿足比較結果的才進行下一個階段,Alpha測驗通過條件通欄包括never、always、equal、not equal、less than、 less than or equal、greater than、greater or equal,
混合:最終顏色值將與FrameBuffer中的顏色值進行混合,計算公式為:finalValue = https://www.cnblogs.com/primarycode/archive/2022/09/18/sourceFactor * sourceValue operation destinationFactor * destinationValue,sourceValue是上個階段計算出的顏色值,destinationValue是幀快取中的顏色值,sourceFactor和destinationFactor為混合因子,其代表的值有如下幾種:
One:1
Zero:0
SrcColor:源RGB的值
SrcAlpha:源A值
DstColor:目標RGB值
DstAlpha:目標A值
OneMinusSrcColor:(1,1,1) - SrcColor
OneMinusSrcAlpha:1- SrcAlpha
OneMinusDstColor:(1,1,1) - DstColor
OneMinusDstAlpha:1 - DstAlpha
operation可以有以下幾種:
Add:源結果+目標結果
Sub:源結果-目標結果
RevSub:目標結果-源結果
經過以上幾個操作,顏色值就可以寫入的Framebufer中了,
本文來自博客園,作者:毅安,轉載請注明原文鏈接:https://www.cnblogs.com/primarycode/p/16704604.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/509035.html
標籤:其他
上一篇:《生死疲勞》讀書有感
下一篇:MFC繪圖——金剛石
