shader 透明度混合

2021-10-02 08:35:07 字數 2262 閱讀 2166

透明度混合是實現了真正的半透效果。它會以當前片元透明度作為混合因子,與已經儲存在顏色緩衝區中的顏色進行混合,得到新的顏色。同時要關掉深度寫入,小心物體的渲染順序。

用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...