欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 八卦 > Unity图形学之Shader2.0 深度测试

Unity图形学之Shader2.0 深度测试

2025/4/2 10:03:43 来源:https://blog.csdn.net/woshiyuyanjia/article/details/143788467  浏览:    关键词:Unity图形学之Shader2.0 深度测试

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)}}
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词