透明度混合是實現了真正的半透效果。它會以當前片元透明度作為混合因子,與已經儲存在顏色緩衝區中的顏色進行混合,得到新的顏色。同時要關掉深度寫入,小心物體的渲染順序。
用blend srcfactor dstfactor來進行混合。這個命令在設定混合因子的同時也開啟了混合模式,否則不會有混合效果,因為開啟了混合模式,片元的透明通道才有意義。我們把源顏色的混合因子設為srcalpha,目標的設為oneminussrcalpha。則混合後的新顏色為:
dstcolor = srcalpha * srccolor + (1 - srcalpha) * dstcolor
需要注意的是,當使用min或max時,混合因子是不起作用的,它只會判斷源顏色和目標顏色的比較結果。
以下是幾種常見的混合型別,得到類似photoshop混合模式中的效果:
//正常(normal)透明度混合
blend srcalpha oneminussrcalpha
//柔和相加
blend oneminusdstcolor one
//正片疊底
blend dstcolor zero
//兩倍相乘
blend dstcolor srccolor
//變暗
blendop min
blend one one
//變亮
blend oneminusdstcolor one
blend one oneminussrccolor
//線性減淡
blend one one
shader "myshader/transparentblend"
_diffuse("diffuse",color) = (1,1,1,1)
_alphascale("alpha scale",range(0,1))=1
} subshader
lod 100
zwrite off//關閉深度寫入
blend srcalpha oneminussrcalpha//開啟並設定混合模式
pass
cgprogram
#pragma vertex vert
#pragma fragment frag
#include "unitycg.cginc"
#include "unitylightingcommon.cginc"
sampler2d _maintex;
float4 _maintex_st;
fixed4 _diffuse;
float _alphascale;
struct v2f
;fixed4 frag(v2f i) : sv_target
endcg
} }fallback "transparent/vertexlit"
}
這樣寫已經實現了透明效果,但是對於一些特殊的物體,比如那些捲來捲去的互相交錯的物體,由於關閉了深度寫入,所以顯示出來的物體的深度不一樣,從這個角度看a在b的前面,但換個位置看的時候,b可能在a前面了,所以對於這些特殊的物體,要多加乙個pass通道來開啟深度寫入,並且不能寫入顏色值。
**如下:
shader "myshader/transparentblend2"
_diffuse("diffuse",color) = (1,1,1,1)
_alphascale("alpha scale",range(0,1))=1
} subshader
lod 100
pass
pass
zwrite off//關閉深度寫入
blend srcalpha oneminussrcalpha//開啟並設定混合模式
cgprogram
#pragma vertex vert
#pragma fragment frag
#include "unitycg.cginc"
#include "unitylightingcommon.cginc"
sampler2d _maintex;
float4 _maintex_st;
fixed4 _diffuse;
float _alphascale;
struct v2f
;fixed4 frag(v2f i) : sv_target
endcg
} }fallback "transparent/vertexlit"
}
透明度混合
透明度混合 可以實現半透明效果。使用當前片元的透明度作為混合因子,與已經儲存在顏色緩衝中的顏色值進行混合,得到新的顏色。同時需要關閉深度寫入,注意渲染順序問題。混合命令 blend 這個命令在設定的同時也開啟了混合模式,開啟之後才能使用混合。混合是乙個逐片元操作。常用語義 blend off 關閉混...
UnityShader 透明度混合
關閉深度寫入帶來的問題 開啟深度寫入的半透明效果 shaderlab的混合命令 透明度混合 實現 開啟深度寫入的半透明效果 實現 透明度混合可以得到真正的半透明效果。它會使用當前片元的透明度作為混合因子,與已經儲存在顏色緩衝中的顏色值進行混合,得到新的顏色。但是,透明度混合需要關閉深度寫入,這使得我...
Shader學習的基礎知識(八)透明度混合
blend是unity提供給我們的的混合模式命令,有以下幾種形式 名稱意義 blend off 關閉混合 blend srcfactor dstfactor 開啟混合源色會乘以srcfactior而目標色會乘以dstfactor blend srcfactor dstfactor,srcfactor...