Unity-ShaderLab:混合
混合用于生成透明對(duì)象。

渲染圖形時(shí),在執(zhí)行所有著色器并應(yīng)用所有紋理后,像素將寫入到屏幕。這些像素與已有像素的組合方式由 Blend 命令控制。
語法
Blend Off
:關(guān)閉混合(這是默認(rèn)值)
Blend SrcFactor DstFactor
:配置并啟用混合。生成的顏色將乘以?SrcFactor。屏幕上的已有顏色乘以?DstFactor,然后將這兩個(gè)值相加。
Blend SrcFactor DstFactor, SrcFactorA DstFactorA
:同上,但使用不同系數(shù)來混合 Alpha 通道。
BlendOp Op
:不將混合顏色相加,而是對(duì)它們執(zhí)行不同的操作。
BlendOp OpColor, OpAlpha
:同上,但是對(duì)顏色 (RGB) 通道和 Alpha (A) 通道使用不同的混合操作。
此外,您還可以設(shè)置上層渲染目標(biāo)混合模式。當(dāng) 使用多渲染目標(biāo) (MRT) 渲染時(shí),上面的常規(guī)語法 將為所有渲染目標(biāo)設(shè)置相同的混合模式。以下語法可以為各個(gè)渲染目標(biāo)設(shè)置不同的混合模式,其中?N
?是渲染目標(biāo)索引(0 到 7)。此功能適用于大多數(shù)現(xiàn)代 API/GPU(DX11/12、GLCore、Metal 和 PS4):
Blend N SrcFactor DstFactor
Blend N SrcFactor DstFactor, SrcFactorA DstFactorA
BlendOp N Op
BlendOp N OpColor, OpAlpha
AlphaToMask On
:開啟 alpha-to-coverage。使用 MSAA 時(shí),alpha-to-coverage 會(huì)根據(jù)像素著色器結(jié)果 Alpha 值按比例修改多重采樣覆蓋率遮罩。這通常用于比常規(guī) Alpha 測(cè)試更少鋸齒的輪廓;對(duì)植被和其他經(jīng)過 Alpha 測(cè)試的著色器非常有用。
混合運(yùn)算
可使用以下混合運(yùn)算:

混合系數(shù)
以下所有屬性對(duì)?Blend?命令中的 SrcFactor 和 DstFactor 都有效。源是指計(jì)算所得顏色,目標(biāo)是指屏幕上已有的顏色。如果?BlendOp?在使用邏輯運(yùn)算,則將忽略混合系數(shù)。

詳細(xì)信息
以下是最常見的混合類型:
Alpha 混合、Alpha 測(cè)試和 alpha-to-coverage
為了繪制大多數(shù)完全不透明或完全透明的對(duì)象(其中透明度由紋理的 Alpha 通道定義,例如樹葉、草、鐵絲網(wǎng)等),通常使用幾種方法:
Alpha 混合

這通常意味著對(duì)象必須被視為“半透明”,因而無法使用某些渲染功能(例如:延遲著色,無法接受陰影)。凹陷或重疊的 Alpha 混合對(duì)象通常也有繪制排序問題。
通常,Alpha 混合著色器還設(shè)置透明渲染隊(duì)列,并關(guān)閉深度寫入。因此,著色器代碼如下所示:
Alpha 測(cè)試/鏤空

通過在像素著色器中使用?clip()
?HLSL 指令,可以根據(jù)某些條件對(duì)像素進(jìn)行“廢棄”處理。這意味著對(duì)象仍然可以被視為完全不透明,并且沒有繪制順序問題。但是,這意味著所有像素都是完全不透明或透明的,導(dǎo)致鋸齒(失真)。
通常,經(jīng)過 alpha 測(cè)試的著色器還會(huì)設(shè)置鏤空渲染隊(duì)列,因此著色器代碼如下所示:
Alpha-to-coverage

當(dāng)使用多重采樣抗鋸齒(MSAA,請(qǐng)參閱?QualitySettings)時(shí),可通過使用 alpha-to-coverage GPU 功能來改進(jìn) Alpha 測(cè)試方法。根據(jù)使用的 MSAA 級(jí)別,這將改善邊緣外觀。
此功能最適合用于大多數(shù)不透明或透明的紋理,并且具有非常薄的“部分透明”區(qū)域(草、樹葉和類似物)。
通常,alpha-to-coverage 著色器還會(huì)設(shè)置鏤空渲染隊(duì)列。因此,著色器代碼如下所示:
示例
以下是一個(gè)小型著色器示例,用于為屏幕上已有的任何內(nèi)容添加紋理: