Queue:渲染队列
渲染队列的值越小,渲染级别就越靠前,比如背景层就比如Background和Geometry显示的效果是Geometry在Background之上
值:Background背景层级别的渲染值为1000
Geometry几何体级别的渲染值为2000
AlphaTest 通道测试2450
Transparent 任何通道混合的对象使用该队列,带有透明效果的物体,玻璃或者粒子等3000
Overlay 镜头特效层4000
Zwrite off 重写对象的深度排序Zwrite On是指记录下当前渲染的物体的深度值,以便渲染的时候对深度进行排序,带有透明效果的物体应该开启深度测试,ZTest 某个阈值。
总结:如果想要自己控制渲染顺序,我们就应该关闭深度写入,打开深度测试,,当你关闭了这些,物体之间的渲染顺序会根据你在渲染队列标签设置的渲染
深度测试ZTest 的取值范围:Greater,GEqual,Less,LEqual,Equal,NotEqual,Always,Never,Off
颜色混合命令:Blend取值范围One,Zero,SrcColor,SrcAlpha,DisColor,DisAlpha,OneMinusSrcColor,OneMinusSrcAlpha,OneMinusDstColor,OneMinusDstAlpha
其中Src标签的表示源颜色,Dis标签的表示目标颜色,OneMinus表示对颜色取反
Shader "Unlit/任务10-1透明度渲染队列测试实体"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
Tags { "RenderType"="Opaque" "Queue" = "Geometry" }
LOD 200
Pass
{
Cull Off
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
};
sampler2D _MainTex;
float4 _MainTex_ST;
v2f vert (appdata_full v)
{
v2f o;
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
fixed4 col = tex2D(_MainTex, i.uv);
return col;
}
ENDCG
}
}
}
Shader "Unlit/任务10-2透明度渲染队列测试透明"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
Tags { "RenderType"="Transparent" "Queue" = "Transparent" }
LOD 100
Pass
{
Blend SrcAlpha OneMinusSrcAlpha
ZWrite Off//深度写入
ZTest Off //深度测试
Cull Off
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
};
sampler2D _MainTex;
float4 _MainTex_ST;
v2f vert (appdata_full v)
{
v2f o;
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
float3 col = tex2D(_MainTex, i.uv).rgb;
float4 color = float4(col,0.2);
return color;
}
ENDCG
}
}
}
一.当我们关闭透明度物体的深度写入和深度测试,打开透明的深度写入和深度测试:原因是由于透明度物体没有写入深度,所有默认的渲染队列是2450,而实体的渲染队列是2000,透明度物体后渲染,所有显示效果就在实体前面了!这里透明效果的物体本来在实体的后面!!
二.当我们打开透明物体的深度写入和深度测试的时候:这里由于打开了深度测试和深度写入,按照相机的深度去渲染,而不是我们写入的队列,先渲染前面的,后渲染后面的,所有是这样的效果。
三.当我们关闭透明物体的深度写入,关闭深度测试的时候:
四.当我们打开透明物体的深度写入,打开深度测试的时候:
五.当我们没有写入深度的时候,深度测试也不会生效。
总结: 当我们关闭深度写入的时候,透明物体的前后会正常显示,当我们关闭深度写入打开深度测试的时候,透明物体的渲染队列会正常。当前都是在实体的深度写入和深度测试都是打开的时候。深度写入是指写入摄像机离物体的距离,也就是景深。