Unity3D Shader(14)——Fragment Shader(遮挡、透明效果)

时间:2022-03-15 04:32:30

要形成遮挡透明效果,需要两个pass通道,一个pass通道渲染未遮挡部分,一个pass通道渲染被遮挡部分。这其中比较关键的一点是zwrite、ztest的用法(这个可以看官方文档及自己尝试)。
其中,”Queue” = “Transparent(透明)”表示这个渲染队列在几何体和Alpha测试队列之后被渲染,采用由后到前的次序,比如玻璃和粒子的的效果就用这个。除了 Transparent(透明)这个渲染队列以外,还有Background(背景),Geometry(几何体),AlphaTest(透明测试),Overlay(覆盖)的渲染队列。Background(背景)用于天空盒。Geometry(几何体)用于大多数不透明几何体,AlphaTest(透明测试)用于Alpha测试的几何体,Overlay(覆盖)用于实现叠加效果,如镜头光晕。
zwrite、ztest的用法参考以下这篇博客:
http://blog.csdn.net/lyh916/article/details/45317571
具体代码及效果:

Shader "Custom/FG" {

SubShader {
Tags { "Queue" = "Transparent" }

LOD 200
pass{
Blend SrcAlpha OneMinusSrcAlpha
zwrite on
ztest greater


CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma target 3.0

#include "UnityCG.cginc"


struct v2f{
float4 pos:POSITION;

};

v2f vert(appdata_base v){
v2f o;
o.pos=UnityObjectToClipPos(v.vertex);
return o;
}

float4 frag(v2f IN):color{

float4 col=float4(1,0,0,0.5);
return col;
}


ENDCG
}
pass{
Blend SrcAlpha OneMinusSrcAlpha
zwrite on
ztest less


CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma target 3.0

#include "UnityCG.cginc"


struct v2f{
float4 pos:POSITION;

};

v2f vert(appdata_base v){
v2f o;
o.pos=UnityObjectToClipPos(v.vertex);
return o;
}

float4 frag(v2f IN):color{

float4 col=float4(0,0,1,1);
return col;
}


ENDCG
}
}
FallBack "Diffuse"
}

Unity3D Shader(14)——Fragment Shader(遮挡、透明效果)