Shader學習的基礎知識(八)透明度混合

2021-09-12 05:47:45 字數 3029 閱讀 6605

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.建立了...