Unity的的貼圖導入面闆上有個開關,
Alpha Is Transparency
:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5yNihTO0YWO4gjMmFDNmdzM5ETZiBDZ5MTNmZWM0MGNw8CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
文檔中是這樣說的:
Enable this property to dilate the color and avoid filtering artifacts on the edges if the alpha channel you specify is Transparency.
本文講下這個選項做什麼,解決什麼問題。
做什麼?
這個選項開啟後,圖檔中所有完全透明像素(alpha == 0)的RGB會改寫為:與其最臨近非完全透明像素(alpha>0)的RGB。可以做個簡單的試驗看一下,建立一張4x4的圖,中間2x2不透明給上不同顔色,周圍一圈完全透明。
導入Unity後,分别看下開啟/不開啟
Alpha Is Transparency
時,用不透明shader輸出RGB部分。
不開啟 Alpha Is Transparency
Alpha Is Transparency
完全透明像素的RGB為白色(PS的預設行為)。網頁背景白色為了便于觀察,圖檔四周加了黑邊框。
開啟 Alpha Is Transparency
Alpha Is Transparency
再來瞧下開啟時的情況:
周圍一圈的完全透明像素RGB值被填充了,填充成了臨近非完全透明像素的RGB。
解決什麼問題?
減少紋理過濾産生的瑕疵。還是拿上面的4x4圖檔為例,用半透明shader疊加到灰色背景。
圖檔開啟雙線性采樣後放大顯示(發生magnification)。對比下開啟和關閉時的情況:
可以看到右側關閉
Alpha Is Transparency
時 ,插值部分顔色泛白。兩種情況透明通道的插值是一樣的,問題是,
插值的出來的RGB也有全透明像素RGB的貢獻,全透明區域的白色和其它顔色混合産生了白邊。
在本文的例子中是白邊,也有可能是其它顔色邊,這取決于全透明區域的RGB部分存了什麼。
在生成 Mipmap 時也會有同樣的問題,會引入不期望的顔色。
Unity通過覆寫全透明像素的RGB,使這些像素存儲的RGB與臨近像素一緻,達到了減少紋理過濾瑕疵的目的。這問題其實和 straight alpha 産生的問題類似,是以有了 premultiplied alpha。差別就是Unity 的
Alpha Is Transparency
隻處理全透明像素,解決了一部分問題而且不用修改混合公式,而預乘alpha除了能達到一樣的目的還可以緩解半透明像素之間過濾産生的顔色問題。
其它解決方式?
Unity的方式在引擎導入資源時做了全透明像素的修改,同樣也可以在美術軟體裡達到相同的目的,沒有統一的術語有叫 padding 的,也有叫 color dilation 的,PVRTexTool 中叫 alpha bleed,這裡列舉一些相關資料:
Edge padding - polycountwiki.polycount.com
Dilate: Colorshare.substance3d.com
Applying Edge Padding to Alpha Texturesdocs.unity3d.com
PVRTexTool Command Line Optionsdocs.imgtec.com Advanced Edge Paddingravingbots.com White Edge on Transparent Textureanswers.unity.com Substance Painter - Paddingdocs.substance3d.com
How to get rid of white edge artifacts when using alpha texture?blender.stackexchange.com
https://share.substance3d.com/libraries/445share.substance3d.com
最後打個小廣告,我司(友誼時光)引擎開發部2021年招新,覺得北上廣房價太貴,願意來蘇州發展的新老同學隻要你有一技之長請私信我。