1.渲染順序
對於開發具有透明效果的Shader而言,渲染順序十分重要,爲了解決渲染順序的問題,Unity提供了渲染隊列:
名稱 | 描述 |
Background | 這個渲染隊列會在任何其他隊列之前被渲染,我們通常使用該隊列來渲染那些需要繪製在背景上的物體 |
Geometry | 默認的渲染隊列,大多數物體都是用這個隊列,不透明物體使用這個隊列 |
AlphaTest | 需要透明度測試的物體使用這個隊列,在所有不透明物體渲染之後再渲染他們會更高效 |
Transparent | 這個隊列中的物體會在所有Geometry和AlphaTest物體渲染後,再按從後往前的順序進行渲染,任何使用了透明度混合(例如關閉了深度寫入的Shader)的物體都應該使用該隊列 |
OverLay | 該隊列用於實現一些疊加效果,任何需要在最後渲染的物體都應該使用該隊列。 |
2.透明度測試
只要一個片元的透明度不滿足條件(通常是小於某個閾值),那麼它對應的片元就會被捨棄。被捨棄的片元將不會在進行任何處理,也不會對顏色緩衝產生任何影響;否則,就會按照普通的不透明物體的處理方式來處理它。
3.透明度混合
它會使用當前片元的透明度作爲混合因子,與已經存儲在顏色緩衝中的顏色值進行混合,得到新的顏色,但是,透明度混合需要關閉深度寫入,這時的我們要非常小心物體的渲染順序。
Blend語義:
語義 | 描述 |
Blend Off | 關閉混合 |
Blend SrcFactor DstFactor | 開啓混合,並設置混合因子,源顏色(該片元產生的顏色)會乘於SrcFactor,而目標顏色(已經存在於顏色緩存的顏色)會乘以DstFactor,然後把兩者相加後再存入顏色緩衝中 |
Blend SrcFactor DstFactor,SrcFactorA DstFactorA | 和上面幾乎一樣,只是使用不同的因子來混合透明通道 |
BlendOp BlendOperation | 並非是把源顏色和目標顏色簡單地加減後混合,而是使用BlendOperation來對他們進行其他操作 |
混合因子:
參數 | 描述 |
One | 因子爲 1 |
Zero | 因子爲 0 |
SrcColor | 因子爲源顏色值,當用於混合RGB通道的混合等式時,使用SrcColor的RGB分量作爲混合因子;當用於混合A的混合等式時,使用SrcColor的A分量作爲混合因子 |
SrcAlpha | 因子爲源顏色的透明度值(A通道) |
DstColor | 因子爲目標顏色值。當用於混合RGB通道的混合等式時,使用DstColor的RGB分量作爲混合因子;當用於混合A的混合等式時,使用DstColor的A分量作爲混合因子 |
DstAlpha | 因子爲目標顏色的透明度值(A通道) |
OneMinusSrcColor | 因子爲(1-源顏色)。當用於混合RGB通道的混合等式時,使用結果的的RGB分量作爲混合因子;當用於混合A的混合等式時,使用結果的A分量作爲混合因子 |
OneMinusSrcAlpha | 因子爲(1-源顏色的透明度值) |
OneMinusDstColor | 因子爲(1-目標顏色)。當用於混合RGB通道的混合等式時,使用結果的的RGB分量作爲混合因子;當用於混合A的混合等式時,使用結果的A分量作爲混合因子 |
OneMinusDstAlpha | 因子爲(1-目標顏色的透明度值) |
BlendOperation:
操作 | 描述 |
Add |
將混合後的源顏色和目標顏色相加。默認的混合操作。使用的混合等式是: |
Sub |
將混合後的源顏色減去混合後的目標顏色。使用的混合等式是: |
RevSub |
將混合後的目標顏色減去混合後的源顏色。使用的混合等式是: |
Min |
使用源顏色和目標顏色中較小的值,是逐分量比較的,使用的混合等式爲: |
Max | |