AlphaTest可以在手機上使用嗎?性能是否很差?

如上圖,項目是在安卓平台,當我選擇了帶AlphaTest的shader的時候就會提示:

PerformanceChecks.ShaderWithClipAndroid

是提示在安卓上面性能有可能出現問題嘛?

如果不能推薦在手機上面使用AlphaTest,那麼如何實現圖中灌木的效果?

試過alpha融合,ZWrite On時:

ZWrite Off時:

效果都不對。。

shader代碼

// Unlit alpha-blended shader.
// - no lighting
// - no lightmap support
// - no per-material color

Shader "Mobile/UnlitAlpha" {
Properties {
_MainTex ("Base (RGB) Trans (A)", 2D) = "white" {}
}

SubShader {
Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}
LOD 100

ZWrite Off
Blend SrcAlpha OneMinusSrcAlpha

Pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag

#include "UnityCG.cginc"

struct appdata_t {
float4 vertex : POSITION;
float2 texcoord : TEXCOORD0;
};

struct v2f {
float4 vertex : SV_POSITION;
half2 texcoord : TEXCOORD0;
};

sampler2D _MainTex;
float4 _MainTex_ST;

v2f vert (appdata_t v)
{
v2f o;
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex);
return o;
}

fixed4 frag (v2f i) : SV_Target
{
fixed4 col = tex2D(_MainTex, i.texcoord);
return col;
}
ENDCG
}
}

}

都說可以使用融合代替alphaTest,應該怎麼做呢?


是的

對於PowerVR系列而言會影響HSR(隱藏面消除),打斷ISP處理覆蓋同一像素的幾何體(更具體一點,ISP要得到PS執行後的結果才能正確進行HSR,在這一過程中,所有覆蓋了帶有discard操作像素的幾何體全部都要等待)

另外對於使用了類似early-z技術的GPU也是類似的影響

用alphablend的方法可能會有排序的問題,但是如果這些物體不是視覺關注點,可以不在乎。另外還有個較為暴力的處理方法:在不太複雜的情況下,把葉子用模型摳出來,用三角形數量換

alphablend和alphatest並不能無條件的相互替換,否則管線只留一個不就結了?移動端用alphablend代替alphatest實際是沒有辦法的辦法,並不是說完全可以做到alphatest的效果


http://cdn.imgtec.com/sdk-documentation/PowerVR+Performance+Recommendations.The+Golden+Rules.pdfPowerVR的文檔有詳細解釋,同時說明了Alpha Test為什麼比Alpha Blend慢。


在PowerVR的GPU上性能影響比較大(主要是iOS一家),安卓千奇百怪的配置一言難盡,不過跑Unity總體來說性能普遍不如同時代iOS設備。能用AlphaBlend替換AlphaTest的地方盡量用,儘可能減少帶Alpha的貼圖在屏幕中覆蓋的區域。


這種樹葉,想保證效果是無法簡單用Alpha Blend 替換 Alpha Test的。

某些情況,沒有透明穿插,透明三角形圖元保證從後向前排序。這時可用Alpha Blend替換alphatest, 即簡單把要丟棄的像素alpha設置為0。

鑒於題主用的是unity再做一些補充:

對於Unity引擎,渲染順序是Opaque-&>AlphaTest-&>AlphaBlend,這也是PowerVR推薦的渲染順序。

猜測使用AlphaTest的物體Unity進行了z排序(只是猜,因為錯開位置之後,iphone上性能有很大提升)。這樣提前寫入較近像素的深度值,ISP也就忙一次,之後同位置像素的HSR就會受益,一般貼圖上cut掉的像素是少於留下的像素的(只要美術不是特別差), 但AlphaBlend不行,blend必然一層層混合下去。

分別在安卓和iphone上做了類似題主樹之類的測試,AlphaBlend未見提高,甚至比AlphaTest差了不少。

最後做了個極端的測試,整屏一個AlphaBlend VS AlphaTest 結果GPU消耗時間相差不多,但如果有兩層分開,則AlphaTest要好於AlphaBlend,有ms數量級的差距

結論:對於unity這兩個沒啥大的差別,但很多時候你只能選擇AlphaTest, 最好用三角形減少clip掉的區域。

當然兩個與不透明物體比差距還是比較大,能用三角形替換的情況盡量用三角形


powerVR 的gpu採用一種Deferred Tile-Based-Rendering策略導致alphatest性能差

參考:

why the alphablend is a better choice than alphatest to implement transparent on mobile device?


推薦閱讀:

計算機圖形學發展前景怎麼樣,現在研究領域一般都分哪些?
如果量子通用機被發明了出來,那麼它會對計算機圖形學的研究產生影響嗎?
3D 渲染裡邊緣切角效果 (Round Corner) 有什麼好的實現方法?
圖像生成的整個過程在 OS 內核以及顯卡內的詳細執行流程是什麼樣的?
數字圖像處理與CG有多大聯繫?與遊戲引擎有多大聯繫?

TAG:遊戲開發 | 遊戲引擎 | Unity遊戲引擎 | 計算機圖形學 |