2019-12-06 Unity Shader Alpha測試/Alpha混合
主要是為了記錄一下學(xué)習(xí)的歷程,以便于之后回顧和檢視,而且也能強(qiáng)化一下理解。
之前的貼圖部分之后再補(bǔ)上吧。
直接上代碼和效果
Alpha test 透明度測試
工作原理: 如果一個片元的透明的(alpha值,a值)不滿足條件(通常是小于某個閾值),則它對應(yīng)的片元就會被舍棄,而且被舍棄的片元對顏色緩沖區(qū)不產(chǎn)生任何影響(相當(dāng)于不會被渲染/從渲染隊(duì)列剔除?)。否則則會被當(dāng)成正常不透明物體來處理。
透明度測試的函數(shù):
void clip(float?x){
????if(any(x<0))
????discard;//即舍棄該片元
}
代碼來



SubShader中的Tags有三個標(biāo)簽必須聲明,分別代表了歸組(TransparentCutout組),渲染隊(duì)列(AlphaTest)? 是否不受投影器(Projector)影響

關(guān)鍵處在此,該處的clip函數(shù)拓展開來如下
if((texColor.a - _Cutoff) < 0)
discord;
即如果該片元的a值減去_Cutoff設(shè)定的值后小于0,則就會被舍棄。
在此之前和之后的代碼與之前的沒有變化,Alpha測試只是片元著色器中的一環(huán)。

最后使用的Fallback是內(nèi)置的VertexLit,該SubShader保證了使用透明度測試的物體可以正確的先其他物體投射陰影。


但是顯然這個可能存在渲染的問題,在視角透過被舍棄的片元后, 后面的片元沒有被渲染出來(也可能是cube沒有設(shè)置內(nèi)部的渲染)
但Alpha測試不會得到真正的透明效果,它只是通過Alpha測試來篩選片元。

透明度混合
該方法能夠真正實(shí)現(xiàn)透明的效果
原理是使用當(dāng)前片元的透明度作為混合因子,與顏色緩沖區(qū)存在的顏色值進(jìn)行混合得到新的顏色。
但是Alpha Blend需要關(guān)閉ZWrite(深度寫入),即透明物體不會記錄深度值到深度緩沖區(qū),它無法影響到之前和之后的物體的渲染。
其實(shí)實(shí)現(xiàn)也比較簡單,也是在fragment shader中進(jìn)行一些計算(BLEND)

選取一些段落分析

_AlphaScale就是整體的透明度,聲明后可以在Inspector中調(diào)節(jié)

SubShader中的渲染隊(duì)列Queue改為Transparent,歸到Transparent組中。RenderType通常用于著色器替換。

關(guān)閉深度寫入/設(shè)置混合模式與混合因子。SrcAlpha為源顏色的混合因子,OneMinusSrcAlpha為目標(biāo)顏色(存在于顏色緩沖區(qū)的顏色)的混合因子。
DstColor = SrcAlpha * SrcColor + (1 - SrcAlpha) * DstColor

相比上個Alpha Test存在兩個改動,即去掉了Clip函數(shù),將返回值中第四個變量1.0換成了 texColor.a * _AlphaScale,即能夠使用聲明的_AlphaScale來乘片元的a變量,改變片元的透明度。
