溶解/挖孔
渲染队列
半透明材质
合并反射和半透明
Unity 5.6.6f2
1.1 如何抠掉轮廓外区域(不显示)?
Unity渲染顺序
- 所有不透明物体优先渲染,同时开启深度测试和深度写入。
- 带有透明效果的物体根据摄像机距离远近,从后(远)往前(近)渲染,并开启深度测试关闭深度写入
Unity渲染模式:RenderMode
Opaque - 默认, 适用于所有没有透明区域的固体物体.
Cutout - 创建透明效果(挖孔掏边效果),但该效果在不透明和透明之间过渡具有硬边。 在此模式下,没有半透明区域。 当使用Cutout来创建任何带孔效果(树叶或带有孔和破烂物的布料)。
Transparent - 适用于渲染逼真的透明材料,例如透明塑料或玻璃。 材质本身将具有透明度值(基于纹理的Alpha通道和色调的Alpha),反射和照明高光将保持完全清晰可见。
Fade - 允许透明度值完全淡出对象,包括对象可能具有的任何镜面反射高光或反射。 如果要对淡入或淡出的对象设置动画,此模式很有用。 它不适合渲染逼真的透明材料,因为反射和高光也会由淡出效果。
队列RenderOrder:“Queue”=”Geometry”或“Queue”=”Geometry±1”。指示物体所在的渲染顺序层级
-
Background
-1000 最先渲染。通常是地面 -
Geometry
(default) – 2000 适用于大多数不透明对象渲染 -
AlphaTest
– 2450 在绘制Geometry
后,渲染需要经过Alpha测试的对象队列。没有通过测试的片段被discard,移动端少用,用Alpha Blending。 -
Transparent
– 3000 适用于任何半透明物体。 -
Overlay
– 4000 此渲染队列用于叠加效果。 最后渲染的所有内容都应放在此处(例如镜头光晕)。
RenderType
- Opaque: 大多数着色器(“常规”,“自发光”,“反射”,“地形”着色器 )可用
- Transparent: 大多数半透明着色器(透明,粒子,字体,着色器)。
- TransparentCutout: 遮罩的透明度着色器(“挖孔掏边”,PC版本的植被)。
- Background: 天空盒
- Overlay: UI、后处理着色器.
-
TreeOpaque: 地形植被中的树干
- TreeTransparentCutout: 地形植被中的树叶
- TreeBillboard: 植被上附件(类似广告牌),附件渲染顺序比树靠后
- Grass: 草
- GrassBillboard: 草上的附件
我理解的上面划分的意思就是,把一个物体的渲染用树型结构指示该shader提前归组划分,以确定渲染顺序。
fixed4 frag (v2f i) : SV_Target { fixed4 col = tex2D(_MainTex, i.uv); col.a *= _Tint.a; clip(col.a - _AlphScale); return col; }
下面是用blend混合实现clip,没由clip实现溶解方便
Tags { "Queue" = "AlphaTest" "RenderType"="Opaque" "IgnoreProjector"="True"} Pass { Tags { "LightMode"="ForwardBase"} ZWrite Off Blend SrcAlpha OneMinusSrcAlpha CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" sampler2D _MainTex; float4 _MainTex_ST; float _AlphScale; struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; }; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = TRANSFORM_TEX(v.uv, _MainTex); return o; } fixed4 frag (v2f i) : SV_Target { fixed4 col = tex2D(_MainTex, i.uv); return fixed4(col.rgb, col.a*_AlphScale); } ENDCG }
双面透明,用两个Pass剔除。Pass内部默认是剔除背面
Pass { //。。。 Cull Front //。。。 } Pass { //。。。 Cull Back //。。。 }