blend是unity提供給我們的的混合模式命令,有以下幾種形式
名稱意義
blend off
關閉混合
blend srcfactor dstfactor
開啟混合源色會乘以srcfactior而目標色會乘以dstfactor
blend srcfactor dstfactor, srcfactora dstfactora
和上面幾乎一樣,只是使用不同的因子混合
blendop blendoperation
並非排源色和目標色相加混合,而是使用blendoperation對它們進行其他操作
這裡用blend srcfactor dstfactor來進行混合,設定的同也開啟了混合模式,這時候透明通道才有意義。有時候發現自己的模型沒有透明效果,往往就是沒有設定混合因子,或是沒有開啟混合模式。
混合因子:
把srcfactor設為srcalpha,而目標顏色的混合因子dstfactor設為oneminussrcalpha那這樣的話,混合後的顏色則會是:
blend srcalpha oneminussrcalpha
dstcolor(新的)=srcalpha x srccolor + (1 - srcalpha) x dstcolor(舊的)
新的顏色=源色透明度 x 源色顏色 + (1 - 源色透明度) x 舊的目標顏色
引數描述
one因子為1
zero
因子為0
srccolor
源因子為色值 ,當為rgb通道時返回rgb,當為a通道時返回a值
srcalpha
源因子的a通道值
dstcolor
目標因子色值,當rgb通道時返回rgb,當為a通道時返回a值
dstalpha
目標色值為a通道值
oneminussrccolor
因子為1-源顏色。當為rbg則用rgb作為分量,為a通道時則以a作業值
oneminussrcalpha
因子為1-源顏色的a
oneminusdstcolor
因子為1-目標顏色。當為rbg則用rgb作為分量,為a通道時則以a作業值
oneminusdstalpha
因子為1-目標顏色a
當我們需要a通道也進行混合可以使用:
blend srcalpha oneminussrcalpha,one zero
效果是這樣的:
下面上**:
shader "custom/testshader15"
_alphascale("alpha scale",range(0,1))=1
} subshader
pass
//關閉深度寫入
zwrite off
//源因子:透明度 目標因子:1-源因子透明度
//最後會把源因子和目標因子相乘得到最終結果
blend srcalpha oneminussrcalpha
cgprogram
#pragma vertex vert
#pragma fragment frag
#include "lighting.cginc"
fixed4 _color;
sampler2d _maintex;
float4 _maintex_st;
float _alphascale;
struct a2v;
struct v2f;
v2f vert(a2v v)
float4 frag(v2f i):sv_target
endcg
} }}
這個需要使用兩個pass來渲染模型:
step1:第乙個pass開啟深度寫入,但不輸出顏色,目的只是為了把深度值寫入深度緩衝中。
step2:第二個是正常使用混合,由於上乙個pass已經得到了正確的深度資訊,該pass就可以按照畫素級別深度排序進行透明渲染。
但這個很消耗效能!!!
使用:colormask 0則不會輸出顏色資訊
別的**和上面的一樣
pass
名稱
意義blend srcfactor dstfactor
開啟混合,源色會乘以srcfactior,而目標色會乘以dstfactor
blend srcfactor dstfactor, srcfactora dstfactora
和上面幾乎一樣,只是使用不同的因子混合
第乙個過載只有乙個命令來提供兩個因子,也就是說rgb和alpha通道都是用同樣的方式來混合
混合因子有很多srccolor、srcalpha、dstcolor、one、zero等…可以使用第二個過載來進行設定如:
blend srcalpha oneminussrcalpha,one zero
常見的混合型別有:
正常:blend srcalpha oneminussrcalpha
正片疊低:
blend dstcolor zero
等等…使用雙面渲染效能的消耗會成總倍的增加。
我們可以使用cull back|front|off 來實現,但一般情況下我們不會關閉剔除功能。
上面透明的**法制成兩個pass通道,差別在下面:
pass
cull front
//一樣的**...
}pass
cull back
//一樣的**...
}
Shader學習的基礎知識(六)透明效果
在渲染的時候,渲染的順序是非常重要的,對於不透明物體我們不用不考慮是因為有的深度緩衝存在。在渲染時需要把片元中的值進行比較 如果開了深度測試 但一但關了嘗試測試就沒那麼簡單了。透明度測試 只要小於閾值就會被捨棄,完全不透明或完全透明。透明度混合 這種方法才能得到真正的透明效果,但是需要關掉深度測試,...
Shader學習的基礎知識(十四)玻璃效果
這次我們使用第二種渲染紋理方式grabpass來製做乙個玻璃效果。非常簡單,用一張法線紋理來修改法線資訊,通過乙個cubemap來模擬玻璃反射,而在模擬折射時,則使用了grabpass獲取玻璃後面的螢幕影象,並在切線空間中進行偏移後,再對螢幕影象進行取樣來模擬。建立乙個立方體和乙個圓,圓放在立方體裡...
unity基礎開發 shader基礎知識
1.unity中配備了強大的陰影和材料的語言工具稱為shaderlab,以程式語言來看,它類似於cgfx和direct3d的效果框架語法,它描述了材質所必須要的一切諮詢,而不僅僅侷限於平面頂點 畫素著色。2.在unity3d中建立乙個shader assets create shader 3.建立了...