shader AlphaTest透明度測試

2021-10-02 08:20:41 字數 1170 閱讀 3529

通常使用兩種方法來實現透明效果:

透明度測試( alpha test), 這種方法其實無法得到真正的半透明效果;

另一種是透明度混合(alpha blend)

對於不透明物體,不考慮它們的渲染順序也能得到正確的排序效果,這是由於強大的深度緩衝的存在。深度緩衝的基本思想是:根據深度快取中的值來判斷該片元距離攝像機的距離,當渲染乙個片元時,需要把它的深度值和已經存在於深度緩衝中的值進行比較(如果開啟了深度測試,預設判斷是小於等於),如果它的值距離攝像機更遠,那麼說明這個片元不應該被渲染到螢幕上(有物體擋住了它);否則,這個片元應該覆蓋掉此時顏色緩衝中的畫素值,並把它的深度值更新到深度緩衝中(如果開啟了深度寫入)。

透明度測試:只要乙個片元的透明度不滿足條件(通常是小於某個閾值),那麼它對應的片元就會被捨棄。被捨棄的片元將不會再進行任何處理,也不會對顏色緩衝產生任何影響;否則,就會按照普通的不透明物體的處理方式來處理它,即進行深度測試、深度寫入等。也就是說,透明度測試是不需要關閉深度寫入的,它和其他不透明物體最大的不同就是它會根據透明度來捨棄一些片元。雖然簡單,但是它產生的效果也很極端,要麼完全透明,即看不到,要麼完全不透明。

shader "myshader/alphatest"

_diffuse("diffuse",color) = (1,1,1,1)

_cutoff("alphatest",range(0,1))=0.5

} subshader

cull off

lod 100

pass

;

fixed4 frag(v2f i) : sv_target

//漫反射

float3 worldlight = normalize(_worldspacelightpos0.xyz);

float3 diffuse = _diffuse.rgb*texcolor*_lightcolor0.rgb*(saturate(dot(worldlight, i.worldnormal)*0.5+0.5));

float3 temp = diffuse + ambient;

return fixed4(temp, 1);

}endcg

} }}

透明度演算法

方法一 首先,要能取得上層與下層顏色的 rgb三基色,然後用 r,g,b 為最後取得的顏色值 r1,g1,b1是上層的顏色值 r2,g2,b2是下層顏色值 r r1 2 r2 2 g g1 2 g2 2 b b1 2 b2 2 以上為50 透明。若要使用不同的透明度用以下演算法 alpha 透明度 ...

透明度測試

shader custom testshader cutoff alpha cutoff range 0,1 0.5 subshader pass cgprogram pragma vertex vert pragma fragment frag include lighting.cginc fix...

初探透明度

透明度實現方式 在unity中實現透明度效果有兩種方案,一種是透明度測試,一種是透明度混合。透明度測試實現方式 既是片元的透明度和透明度閾值進行比較,小於這個透明度閾值的片元會直接被捨棄掉,不會做任何處理,相當於該片元透明。而大於這個透明度閾值的則會按照不透明的方式進行處理。實現 如下 shader...