在实现物体的透明时,发现通过改变颜色的alpha值,并不能改变透明度。
通过查阅资料,发现透明度混合可以解决这个问题。它会将当前片元的透明度作为混合因子,与颜色缓冲中的颜色混合,得到新的颜色。使用透明度混合需要注意的是要关闭深度写入。我们使用unity的混合命令Blend来实现混合。
代码实现:
1.在Properties中定义一个透明度
Properties {
_Color ("Diffuse Color", Color) = (1,1,1,1)
_MainTex ("Diffuse map (Cutout A)", 2D) = "white" {}
_BumpMap ("Normal map", 2D) = "bump" {}
_SpecColor ("Specular Color", Color) = (1,1,1,1)
_Glossiness ("Glossiness", Range(0, 1)) = 0.5
_Alpha("Alpha",Range(0,1))=0.5
[HideInInspector]_Cutoff ("Alpha cutoff", Range(0,1)) = 0.5
}
2.修改Tags
SubShader {
Tags {
"Queue"="Transparent"
"RenderType"="Fade"
"IgnoreProjector" = "Transparent"
}
3.在Pass中设置合适的混合状态,关闭深度写入,定义_Alpha。
ZWrite Off //关深度写入
Blend SrcAlpha OneMinusSrcAlpha//设置混合状态
float _Alpha;
4.修改片元着色器,通过距离来调节材质的透明度
fixed4 frag(v2f i){
......
float distance=length(_WorldSpaceCameraPos-i.posWorld);
if(distance-12<=0){
_Alpha=abs(distance-15)/10;
}
fixed4 finalRGBA = fixed4(finalColor,_Alpha);
return finalRGBA;
}