初探透明度

2021-08-08 17:39:43 字數 3757 閱讀 8825

透明度實現方式:在unity中實現透明度效果有兩種方案,一種是透明度測試,一種是透明度混合。

透明度測試實現方式:既是片元的透明度和透明度閾值進行比較,小於這個透明度閾值的片元會直接被捨棄掉,不會做任何處理,相當於該片元透明。而大於這個透明度閾值的則會按照不透明的方式進行處理。實現**如下:

shader "custom/alphatest" 	// 主紋理

_cutoff("alpha cutoff", range(0, 1)) = 0.5 // 透明度閾值

} subshader

pass

cgprogram

#pragma vertex vert

#pragma fragment frag

#include "lighting.cginc"

// 材質檢視面板關聯屬性

fixed4 _color;

sampler2d _maintex;

float4 _maintex_st;

fixed _cutoff;

struct a2v ;

struct v2f ;

v2f vert(a2v i)

fixed4 frag(v2f i) : sv_target

endcg

} }fallback "transparent/cutout/vertexlit" // 預設的透明度測試shader

}

注意點:

1.要想有透明度測試功能必須設定渲染佇列標籤為透明度測試佇列模式,渲染型別為透明度測試型別,投影影響也必須關閉,也就是tags

2.透明度測試實現透明處理的核心就是使用clip函式,當片元透明度小於閾值時,該片元就會被discard(捨棄)掉,從而表現為透明,否則就會按照不透明的方式進行處理。

3.透明度測試處理紋理的邊界處往往由於畫素精度的原因而存在不平滑,有鋸齒的現象。

透明度混合實現方式:既是片元的透明度作為混合因子,片元的深度和深度緩衝區中的深度做比較,小於深度緩衝區中的深度時,片元的透明度不會與顏色緩衝區中的顏色進行混合,否則就會進行混合,最終片元的顏色會替換到顏色緩衝區中的顏色。實現**如下:

shader "custom/alphablend" 	// 主紋理

_alphascale("alpha scale", range(0, 1)) = 0.5 // 透明度係數

} subshader

pass

// 關閉深度寫入,避免深度變化造成半透明異常

zwrite off

// 開啟透明度混合,並設定片元顏色的乘積因子以及顏色緩衝區中顏色的乘積因子

blend srcalpha oneminussrcalpha

cgprogram

#pragma vertex vert

#pragma fragment frag

#include "lighting.cginc"

// 材質檢視面板關聯屬性

fixed4 _color;

sampler2d _maintex;

float4 _maintex_st;

fixed _alphascale;

struct a2v ;

struct v2f ;

v2f vert(a2v i)

fixed4 frag(v2f i) : sv_target

endcg

} }fallback "transparent/vertexlit" // 預設的透明度混合shader

}

注意點:

1.必須使用tags渲染標籤來設定渲染隊列為透明度混合模式,渲染型別為透明度混合型別,投影影響功能關閉。也就是tags 。

2.必須使用blend渲染狀態來設定片元顏色乘積因子以及畫素緩衝區中顏色的乘積因子,然後按照blendop指定的混合操作方式(預設是加方式)進行混合得到最終的畫素值。也就是blend srcalpha oneminussrcalpha。

3.為了避免透明度混合時出現由於深度寫入開啟,深度值發生變化而造成透明後面的物體由於距離攝像機遠而被裁剪掉,通常需要關閉深度寫入的,也就是zwrite off。

渲染物體順序:一般而言渲染順序遵循以下原則:

1.先渲染不透明物體,並開啟深度測試和深度寫入。

2.將透明物體按照距離攝像機遠近距離進行排序,然後從後往前進行渲染物體,並開啟深度測試,關閉深度寫入。

3.對於多個透明物體重疊時,往往會產生迴圈重疊的透明效果,此時可以採用分割物體的方式進行重新正確排序來解決。

4.對於自身透明物體網格中不同的頂點存在不同深度時,往往會產生錯誤的透明效果,此時可以採用分割網格或者多啟用乙個pass進行頂點自身的深度寫入,另外乙個pass進行顏色混合輸出來解決。

混合因子:unity中混合公式有兩個,乙個是針對rgb,乙個是針對a,並且混合物件有片元顏色和畫素緩衝區顏色,所以混合因子有四個,對應的計算公式如下:

1.對應的命令設定為:blend srcfactor_rgb dstfactor_rgb srcfactor_a dstfactor_a,並且不設定srcfactor_a和dstfactor_a時,此時使用srcfactor_rgb和dstfactor_rgb的值來代替srcfactor_a和dstfactor_a。

2.常見的混合因子如下:

此處截圖中dstcolor為目標顏色,而不是源顏色。

混合操作:使用blendop指令來進行指定,預設為add混合操作,常見的混合操作如下:

1.結合混合因子以及混合操作,常見的混合效果如下:

透明度混合:blend srcalpha oneminussrcalpha

柔和相加:blend oneminusdstcolor one

正片疊底,既是相乘:blend dstcolor zero

兩倍相乘:blend dstcolor srccolor

變暗:blendop min blend one one

變亮:blend max blend one one

濾色:blend oneminusdstcolor one 等價與 blend one oneminussrccolor

線性減淡:blend one one

圖元剔除:就是unity將某乙個圖元基於攝像機觀察方向進行裁減,使用cull渲染命令進行操作,預設剔除物體的背面,當然也可以剔除前面甚至關掉剔除功能,對應的命令如下:cull back/front/off。而當關閉剔除時,針對透明度測試而言,由於已經開啟深度測試和深度寫入,所以前後面都是有序的,渲染時不會存在問題,但是針對透明度混合而言,由於開啟深度測試,關閉了深度寫入,此時前後兩面對應的順序就是未知的,此時可以使用兩個pass渲染通道,乙個在渲染時剔除掉正面,乙個在渲染時剔除掉背面,從而實現先繪製背面,再繪製正面從而變的有序,得到正確的渲染效果。

透明度演算法

方法一 首先,要能取得上層與下層顏色的 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...

透明度問題

實現透明的三種方法 1 css3的opacity 不透明 取值是在0 1 表示完全透明,1表示完全不透明 2 rgba red,green,blue,alpha alpha的取值0 1 3 ie專屬濾鏡filter alpha opacity x x的取值從0到100,例如 filter alpha...