@[TOC]((总结自Unity Shader 入门精要))

概述

Unity实现透明效果主要有两种方式:
1.透明度测试
2.透明度混合

透明度测试

启用透明度测试,Alpha低于限制条件的物体全部不渲染。此种操作没法显示半透明的物体。
方法:

//渲染队列设为半透明物体 ,不受投影器影响,指明该shader是一个使用了透明度测试的shader
 Tags{“Queue”=“AlphaTest” “IgnoreProjector”=“True” “RenderType”=“TransparentCutout”}texColor=tex2D(_MianTex,i.uv)
 clip(texColor.a-CutOff)

透明度混合

可以实现半透明效果,它会使用当前偏远的透明度作为混合因子与已经存在于颜色缓冲区的颜色值进行混合,得到新的颜色。

但是透明度混合需要关闭半透明物体的深度写入,也就是无法将深度信息写入深度缓存中,一旦半透明物体先渲染,后面不透明物体由于可以写入深度信息就会遮挡住半透明物体,而这不是我们想要的。

并且两个半透明的物体覆盖也要先渲染后面的物体才能保证得到正确的结果。

方法:

Tags{“Queue” = “Transparent” “IgnoreProjector” = “True” “RenderType” = “Transparent”}
 //关闭深度信息写入
 ZWrite Off
 //正常的透明度混合 有很多种可以选择的混合类型
 Blend SrcAlpha OneMinusSrcAlpha

因此:

渲染引擎的渲染顺序一般为:

1.不透明的物体

2.半透明的物体,且按照由远及近进行渲染

但是这种渲染方法在半透明物体互相重叠时候就无法得到正确的效果,情况如下图:

Unity UGUI 透明mask unity平面透明_Unity UGUI 透明mask


为了解决这一问题我们可以使用两个Pass

一个只用于写入深度信息而不输出颜色

Pass
 {
 ZWrite On
 //不输出颜色
 ColorMask 0
 }

双面渲染的透明效果

透明度测试中:
在Pass中添加:Cull Off

透明度混合:
写两个Pass,一个渲染前面,一个渲染后面
Cull Front
Cull Back
(不过在我亲身实践之后发现Cull Off 对透明度混合一样有效果,可以替代上述方案)