翻译11 Unity 透明渲染

空扰寡人 提交于 2020-02-23 20:15:14

溶解/挖孔
渲染队列
半透明材质
合并反射和半透明

Unity 5.6.6f2

image

1.1 如何抠掉轮廓外区域(不显示)?

Unity渲染顺序

  1. 所有不透明物体优先渲染,同时开启深度测试和深度写入。
  2. 带有透明效果的物体根据摄像机距离远近,从后(远)往前(近)渲染,并开启深度测试关闭深度写入

Unity渲染模式:RenderMode

  1. Opaque - 默认, 适用于所有没有透明区域的固体物体.

  2. Cutout - 创建透明效果(挖孔掏边效果),但该效果在不透明和透明之间过渡具有硬边。 在此模式下,没有半透明区域。 当使用Cutout来创建任何带孔效果(树叶或带有孔和破烂物的布料)。

  3. Transparent - 适用于渲染逼真的透明材料,例如透明塑料或玻璃。 材质本身将具有透明度值(基于纹理的Alpha通道和色调的Alpha),反射和照明高光将保持完全清晰可见。

  4. Fade - 允许透明度值完全淡出对象,包括对象可能具有的任何镜面反射高光或反射。 如果要对淡入或淡出的对象设置动画,此模式很有用。 它不适合渲染逼真的透明材料,因为反射和高光也会由淡出效果。

队列RenderOrder:“Queue”=”Geometry”或“Queue”=”Geometry±1”。指示物体所在的渲染顺序层级

  1. Background -1000 最先渲染。通常是地面
  2. Geometry (default) – 2000 适用于大多数不透明对象渲染
  3. AlphaTest – 2450 在绘制Geometry 后,渲染需要经过Alpha测试的对象队列。没有通过测试的片段被discard,移动端少用,用Alpha Blending。
  4. Transparent – 3000 适用于任何半透明物体。
  5. 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
//。。。
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!