Unity3D - Shader - 透明度混合
2017-12-01 19:55
344 查看
透明度混合:此方法可以得到真正的半透明效果。它会使用当前片元的透明度作为混合因子,与已经存储在混合颜色缓冲区中的颜色值进行混合,得到新的颜色。此外,透明度混合需要关闭深度写入(ZWrite Off),这需要小心物体的渲染顺序。
混合需要使用Blend命令:
DstColornew=SrcAlpha∗SrcColor+(1−SrcAlpha)∗DstColorold
关闭深入写入的透明度混合代码:
关闭深入写入后会引发错误的透明效果。例如:
混合需要使用Blend命令:
语义 | 描述 |
---|---|
Blend Off | 关闭混合 |
Blend SrcFactor DstFactor | 开启混合,并设置混合因子。源颜色(该片元产生的颜色)会乘以SrcFactor,而目标颜色(已经存在于颜色缓冲区的颜色)会乘以DstFactor,然后把两者相加后再存储颜色缓冲区中。 |
Blend SrcFactor DstFactor, SrcFactorA DstFactorA | 和上面几乎一样,只是使用不同的因子来混合透明通道 |
BlendOp BlendOperation | 并非把源颜色和目标颜色简单相加后混合,而是使用BlendOperation对它们进行其他操作 |
关闭深入写入的透明度混合代码:
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" }
关闭深入写入后会引发错误的透明效果。例如:
相关文章推荐
- 【浅墨Unity3D Shader编程】之三 光之城堡篇:子着色器、通道与标签的写法 & 纹理混合
- Unity3D ShaderLab压缩混合纹理贴图
- Unity3D ShaderLab 混合两张贴图(Blend)
- Unity3D Shader官方教程翻译(十一)----Shader语法:Pass的Blending(混合)
- 【浅墨Unity3D Shader编程】之五 圣诞夜篇: Unity中Shader的三种形态对比&混合操作合辑
- 【浅墨Unity3D Shader编程】之五 圣诞夜篇: Unity中Shader的三种形态对比&混合操作合辑
- Unity3D Shader官方教程翻译(十一)----Shader语法:Pass的Blending(混合)
- Unity3D Shader官方教程翻译(十一)----Shader语法:Pass的Blending(混合)
- Unity3D Shader官方教程翻译(十一)----Shader语法:Pass的Blending(混合)
- Unity3d Shader(三) Pass(Texturing)混合纹理(同时显示2张图),自发光
- 解读Unity中的CG编写Shader系列6——不透明度与混合
- Unity3D ShaderLab 混合两张贴图(Blend)
- Unity3d之Shader编程:子着色器、通道与标签的写法 & 纹理混合
- 【浅墨Unity3D Shader编程】之三 光之城堡篇:子着色器、通道与标签的写法 & 纹理混合
- 【浅墨Unity3D Shader编程】之三 光之城堡篇:子着色器、通道与标签的写法 & 纹理混合
- 【浅墨Unity3D Shader编程】之五 圣诞夜篇: Unity中Shader的三种形态对比&混合操作合辑
- Unity3D Shader官方教程翻译(十一)----Shader语法:Pass的Blending(混合)
- 【浅墨Unity3D Shader编程】之五 圣诞夜篇: Unity中Shader的三种形态对比&混合操作合辑
- Unity3D - Shader - 透明度测试
- UnityShader初级篇——透明度混合