您的位置:首页 > 移动开发 > Unity3D

Unity3D - Shader - 透明度混合

2017-12-01 19:55 344 查看
透明度混合:此方法可以得到真正的半透明效果。它会使用当前片元的透明度作为混合因子,与已经存储在混合颜色缓冲区中的颜色值进行混合,得到新的颜色。此外,透明度混合需要关闭深度写入(ZWrite Off),这需要小心物体的渲染顺序。

混合需要使用Blend命令:

语义描述
Blend Off关闭混合
Blend SrcFactor DstFactor开启混合,并设置混合因子。源颜色(该片元产生的颜色)会乘以SrcFactor,而目标颜色(已经存在于颜色缓冲区的颜色)会乘以DstFactor,然后把两者相加后再存储颜色缓冲区中。
Blend SrcFactor DstFactor, SrcFactorA DstFactorA和上面几乎一样,只是使用不同的因子来混合透明通道
BlendOp BlendOperation并非把源颜色和目标颜色简单相加后混合,而是使用BlendOperation对它们进行其他操作
DstColornew=SrcAlpha∗SrcColor+(1−SrcAlpha)∗DstColorold

关闭深入写入的透明度混合代码:

Shader "Unity Shaders Book/Chapter 8/Alpha Blend" {
Properties {
_Color ("Main Tint", Color) = (1,1,1,1)
_MainTex ("Main Tex", 2D) = "white" {}
// 用于在透明纹理的基础上控制整体的透明度
_AlphaScale ("Alpha Scale", Range(0,1 )) = 1
}
SubShader {

// RenderType标签可以让Unity
// 把这个Shader归入到提前定义的组(Transparent)
// 用于指明该Shader是一个使用了透明度混合的Shader

// IgnoreProjector=True这意味着该Shader
// 不会受到投影器(Projectors)的影响

// 为了使用透明度混合的Shader一般都应该在SubShader
// 中设置这三个标签

Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}

Pass {

// 向前渲染路径的方式
Tags {"LightMode"="ForwardBase"}

// 深度写入设置为关闭状态
ZWrite Off

// 这是混合模式
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));

// 设置透明度通道的值
return fixed4 (ambient + diffuse ,texColor.a * _AlphaScale);
}

ENDCG
}

}
FallBack "Transparent/VertexLit"
}


关闭深入写入后会引发错误的透明效果。例如:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐