1.什么是深度:物体1和物体2的深度都是10,深度是物体和相机视角水平垂线的投影
物体3的深度是8
2.什么是深度缓存
要渲染的像素的深度信息,比当前存在Gbuffer里的缓存的深度信息小(靠近相机)的时候,就会替换Gbuffer里面的RGBA信息为要渲染的像素信息
3.什么是深度测试:两个指令,对比将要渲染的物体 的Z 值 对比 gbufffer 里面的值
ZWrite On offOn: 是否将 要渲染的物体的深度 写入深度缓存区。
Off : 不往深度缓存去写入 深度值。ZTest Less AlwaysLess : 将要渲染的物体的深度 要小于 gbuffer 里面的深度
Always : 判断条件总是通过。
1.当ZWrite为On时,ZTest通过时,该像素的深度才能成功写入深度缓存,同时因为ZTest通过了,该像素的颜色值也会写入颜色缓存。2.当ZWrite为On时,ZTest不通过时,该像素的深度不能成功写入深度缓存,同时因为ZTest不通过,该像素的颜色值不会写入颜色缓存。3.当ZWrite为Off时,ZTest通过时,该像素的深度不能成功写入深度缓存,同时因为ZTest通过了,该像素的颜色值会写入颜色缓存。4.当ZWrite为Off时,ZTest不通过时,该像素的深度不能成功写入深度缓存,同时因为ZTest不通过,该像素的颜色值不会写入颜色缓存。
4.测试第一种情况:当ZWrite为On时,ZTest通过时,该像素的深度才能成功写入深度缓存,同时因为ZTest通过了,该像素的颜色值也会写入颜色缓存。
Shader "Hidden/WriteOn"
{Properties{_MainTex ("Texture", 2D) = "white" {}}SubShader{// No culling or depth//Cull OffZWrite On //往深度缓存区写入打开ZTest AlwaysPass{CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"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 = v.uv;return o;}sampler2D _MainTex;fixed4 frag (v2f i) : SV_Target{fixed4 col = tex2D(_MainTex, i.uv);// just invert the colors//col.rgb = 1 - col.rgb;return col;}ENDCG}}
}
5.测试第二种情况:当ZWrite为On时,ZTest不通过时,该像素的深度不能成功写入深度缓存,同时因为ZTest不通过,该像素的颜色值不会写入颜色缓存
Shader "Hidden/WriteOn"
{Properties{_MainTex ("Texture", 2D) = "white" {}}SubShader{// No culling or depth//Cull OffZWrite On //往深度缓存区写入打开ZTest LessPass{CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"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 = v.uv;return o;}sampler2D _MainTex;fixed4 frag (v2f i) : SV_Target{fixed4 col = tex2D(_MainTex, i.uv);// just invert the colors//col.rgb = 1 - col.rgb;return col;}ENDCG}}
}
6.测试第三种情况:当ZWrite为Off时,ZTest不通过时,该像素的深度不能成功写入深度缓存,同时因为ZTest不通过,该像素的颜色值不会写入颜色缓存。
Shader "Hidden/WriteOn"
{Properties{_MainTex ("Texture", 2D) = "white" {}}SubShader{// No culling or depth//Cull OffZWrite Off //往深度缓存区写入关闭ZTest LessPass{CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"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 = v.uv;return o;}sampler2D _MainTex;fixed4 frag (v2f i) : SV_Target{fixed4 col = tex2D(_MainTex, i.uv);// just invert the colors//col.rgb = 1 - col.rgb;return col;}ENDCG}}
}
7.测试第四种情况:当ZWrite为Off时,ZTest通过时,该像素的深度不能成功写入深度缓存,同时因为ZTest通过了,该像素的颜色值会写入颜色缓存。
Shader "Hidden/WriteOn"
{Properties{_MainTex ("Texture", 2D) = "white" {}}SubShader{// No culling or depth//Cull OffZWrite Off //往深度缓存区写入关闭ZTest AlwaysPass{CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"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 = v.uv;return o;}sampler2D _MainTex;fixed4 frag (v2f i) : SV_Target{fixed4 col = tex2D(_MainTex, i.uv);// just invert the colors//col.rgb = 1 - col.rgb;return col;}ENDCG}}
}
8.其他指令:
Offset Factor ,Units此语句用两个参数(Facto和Units)来定义深度偏移。
* Factor参数表示 Z缩放的最大斜率的值。 值越小越靠前
* Units参数表示可分辨的最小深度缓冲区的值。 微调 buffer 值 值越小越近相机
使用条件:两个物体 在同一个位置 。 做微调 。
调节前:
调节后:
Shader "Hidden/OffsetRed"
{Properties{_MainTex ("Texture", 2D) = "white" {}}SubShader{Pass{Offset -1,0Color(1,0,0,1)}}
}
Shader "Hidden/OffsetRed"
{Properties{_MainTex ("Texture", 2D) = "white" {}}SubShader{Pass{Offset 0,0Color(0,1,0,1)}}
}