Unity Shader 實現半透明效果

2021-09-24 23:27:32 字數 2852 閱讀 3445

想要實現如下效果:主角可以遮擋背景,背景遮擋主角時候半透明混合

研究了一周,shader知識了解從無到稍稍入門,終於解決了,記錄一下實現方案。

使用blend one oneminussrcalpha指令,也就是srccolor + dstcolor * (1 - srcalpha),假設a和b重疊,先渲染a,然後渲染b,指令在b的shader裡,那麼srccolor是b的顏色,dstcolor是a的顏色,srcalpha是b的透明度,由此可以實現a和b混合後半透明效果

使用stencil標記重疊部分,可以實現只讓重疊部分半透明

所有shader基於sprite-default修改

主角shader:使用stencil標記畫素索引為1,所有被主角渲染過的畫素的索引均為1

stencil

背景shader:採用兩個pass

stencil

stencil

//混合半透明效果,背景 + 主角色* (1-srcalpha)

blend one oneminussrcalpha

...fixed4 frag(v2f in) : sv_target

背景和主角layer均為default,但是order分別為0、1,也就是主角先渲染,最終效果為:

背景和主角layer均為default,但是order分別為0、-1,也就是背景先渲染,最終效果為:

最終實現:主角可以遮擋背景;背景遮擋主角時,重疊部分半透明混合效果

在frag裡通過clip可以過濾一些隱藏畫素點,不會被strencil標記

主角shader

shader "custom/spritedefaltchar"

_color("tint", color) = (1,1,1,1)

[materialtoggle] pixelsnap("pixel snap", float) = 0

} subshader

cull off

lighting off

zwrite off

blend one oneminussrcalpha

pass

cgprogram

#pragma vertex vert

#pragma fragment frag

#pragma multi_compile _ pixelsnap_on

#include "unitycg.cginc"

;struct v2f

;fixed4 _color;

sampler2d _maintex;

sampler2d _alphatex;

float _alphasplitenabled;

fixed4 samplespritetexture(float2 uv)

fixed4 frag(v2f in) : sv_target

endcg}}}

背景shader

shader "custom/spritedefaltbg"

_color("tint", color) = (1,1,1,1)

[materialtoggle] pixelsnap("pixel snap", float) = 0

} subshader

pass

cull off

lighting off

zwrite off

blend one oneminussrcalpha

cgprogram

#pragma vertex vert

#pragma fragment frag

#pragma multi_compile _ pixelsnap_on

#include "unitycg.cginc"

;struct v2f

;fixed4 _color;

sampler2d _maintex;

sampler2d _alphatex;

float _alphasplitenabled;

fixed4 samplespritetexture(float2 uv)

fixed4 frag(v2f in) : sv_target

endcg

}pass

cull off

lighting off

zwrite off

blend one oneminussrcalpha

cgprogram

#pragma vertex vert

#pragma fragment frag

#pragma multi_compile _ pixelsnap_on

#include "unitycg.cginc"

;struct v2f

;fixed4 _color;

sampler2d _maintex;

sampler2d _alphatex;

float _alphasplitenabled;

fixed4 samplespritetexture(float2 uv)

fixed4 frag(v2f in) : sv_target

endcg}}}

UnityShader 根據鏡頭物件進行透明

前些時間接到乙個需求,要求攝像相機位置來判斷,當前是不是需要透明化,需要從半透到最後最後透明,在崩壞3的角色介面裡面有這樣的效果,當你鏡頭推進的時候,頭髮可以又半透到透明狀態變化。關鍵點在 在於用鏡頭位置與物體所在世界位置座標 做比較 shader scene alpha blend alphasc...

unity 2D 透明遮罩 簡單實現物體一半透明

大致需要用到的東西 shader 材質 深度攝像機 unity實現2d遮罩找了許多的解決方法,這個是我採取的一種方法,比較便捷,但不一定是最好的 主要想實現的效果是這樣的,小偷藏在窗戶的後面,並且有移動的動畫,需要遮罩除去其在窗戶之外的部分 首先新建乙個shader,如下,很短 shader dep...

Unity Shader實現模糊效果

今天分享乙個超簡單實現模糊效果的方法,先上圖 核心 就這句 注意要在3.0以上的版本才能使用 在取樣後做偏移取樣再疊加,效果與下面的 類似 float4 frag v2f o sv target 下面的完整 shader custom testshader40 scale scale range 0...