//8.4透明度混合
Shader "Unlit/Chapter8-AlphaBlend"
{
Properties
{
_Color("Main Tint",Color) = (1,1,1,1)
_MainTex("Main Tex",2D) = "white"{}
//用于在透明纹理的基础上控制整体的透明度
_AlphaScale("Alpha Scale",Range(0,1))=1
}
SubShader{
//subshader的Queue标签决定我们使用的渲染队列,Transparent:透明度混合(关闭了深度写入的shader)
//IgnoreProjector设置为True ,这意味着这个shader不会受到投影器(Projectors)的影响
//RenderType标签可以让Unity把这个shader归入到提前定义的组(Transparent)中,以指明该Shader是一个使用了透明测试的shader,RenderType标签通常被用于着色器的替换功能
Tags{"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}
//与透明度测试不同的是,我们还需要在Pass中为透明度混合进行合适的混合状态设置
pass {
//把LightMode设置为ForwardBase,这是为了让unity能够按前向渲染路径的方法为我们正确提供各个光照变量
Tags {"LightMode" = "ForwardBase"}
//把Pass的深度写入(ZWrite)设置为关闭状态(Off)
ZWrite off
/*Blend 是unity提供的设置混合模式的命令
想要实现半透明的效果就需要把当前自身的颜色和已经存在于颜色缓冲中的颜色值进行混合,混合时使用的函数就是由该指令决定的
Blend SrcFactor DsFactor 开启混合,并设置混合因子,源颜色(该片元产生的颜色)会乘以SRCFactor,而目标颜色(已经存在于颜色缓存的颜色)会乘以DSTFactor,
然后把两者相加后再存入颜色缓冲中 P169 */
Blend SrcAlpha OneMinusSrcAlpha
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include"Lighting.cginc"
fixed4 _Color;
sampler2D _MainTex;
float4 _MainTex_ST;
fixed _AlphaScale;
struct a2v {
float4 vertex:POSITION;
float3 normal:NORMAL;
float4 texcoord:TEXCOORD0;
};
struct v2f {
float4 pos:SV_POSITION;
float3 worldNormal:TEXCOORD0;
float3 worldPos:TEXCOORD1;
float2 uv:TEXCOORD2;
};
//在顶点着色器计算出世界空间的法线方向和顶点位置以及变换后的纹理坐标
v2f vert(a2v v) {
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
//世界空间下的法线方向
o.worldNormal = UnityObjectToWorldNormal(v.normal);
//世界空间下的坐标方向
o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
//变换后的纹理坐标
o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
return o;
}
//片元着色器 包含透明度测试代码
fixed4 frag(v2f i) :SV_Target{
//世界空间下的法线归一化
fixed3 worldNormal = normalize(i.worldNormal);
//世界空间下的光线方向归一化
fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));
//对主纹理进行取样
fixed4 texColor = tex2D(_MainTex, i.uv);
//反射率
fixed3 albedo = texColor.rgb*_Color.rgb;
//环境光照
fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz*albedo;
//漫反射
fixed3 diffuse = _LightColor0.rgb*albedo*max(0, dot(worldNormal, worldLightDir));
//设置了该片元着色器返回值中的透明通道,它的纹理像素的透明通道和材质参数_AlphaScale的乘积
return fixed4(ambient + diffuse, texColor.a*_AlphaScale);
}
ENDCG
}
}
Fallback"Transparent/VertexLit"
}
透明度混合8.4
猜你喜欢
转载自blog.csdn.net/ABigDeal/article/details/82257018
今日推荐
周排行