透明度测试
透明度测试原理
它采用一种极端霸道的机制,只要一个片元透明度不满足条件(通常是小于某个阀值),那么他对应的片元就会被舍弃。被舍弃的片元将不会在进行任何处理,也不会对颜色缓冲产生任何影响。否则就会按照普通的不透明物体的处理方式来处理它,即进行深度测试、写入等。也就是说,透明度测试是不需要关闭深度写入的,它和其他的不透明物体最大的不同就是它会根据透明度来舍弃一些片元,所以它产生的效果也很极端,要么完全透明,即看不到,要么完全不透明,就像不透明问题那样。
Shader "Unlit/AlphaTest"
{
Properties
{
_Color("Color",Color)=(1,1,1,1)
_MainTex("Main Tex",2D)="white"{}
_Cutoff("Cut Off",Range(0,1))=0.5
}
SubShader
{
Tags{"Queue"="AlphaTest" "IgnoreProjector"="True" "RenderType"="TransparentCutout"}
Pass
{
Tags{"LightModel"="ForwardBase"}
CGPROGRAM
#include "Lighting.cginc"
#pragma vertex vert
#pragma fragment frag
fixed4 _Color;
sampler2D _MainTex;
float4 _MainTex_ST;
fixed _Cutoff;
struct a2v
{
float4 vertex:POSITION;
float3 normal:NORMAL;
float4 texcoord:TEXCOORD0;
};
struct v2f
{
float4 pos:SV_POSITION;
float3 worldPos:TEXCOORD0;
float3 worldNormal:TEXCOORD1;
float2 uv:TEXCOORD2;
};
v2f vert(a2v v)
{
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
o.worldPos = mul(unity_ObjectToWorld,v.vertex).xyz;
o.worldNormal = UnityObjectToWorldNormal(v.normal);
o.uv = TRANSFORM_TEX(v.texcoord,_MainTex);
return o;
}
fixed4 frag(v2f i):SV_TARGET
{
fixed4 texColor = tex2D(_MainTex,i.uv);
clip(texColor.a - _Cutoff);//如果texColor.a - _Cutoff < 0 则会舍弃掉这个片元
float3 worldNormal = normalize(i.worldNormal);
float3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));
fixed3 albedo = texColor.rgb * _Color.rgb;
fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * albedo;
fixed3 diffuse = _LightColor0.rgb * albedo * saturate(dot(worldNormal,worldLightDir));
return fixed4(ambient+diffuse,1.0);
}
ENDCG
}
}
FallBack "Transparent/Cutout/VertexLit"
}
为了得到更加柔和的透明效果,可以使用透明度混合
网友评论