当前位置: 首页 > article >正文

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

1.什么是深度:物体1和物体2的深度都是10,深度是物体和相机视角水平垂线的投影

物体3的深度是8

2.什么是深度缓存

要渲染的像素的深度信息,比当前存在Gbuffer里的缓存的深度信息小(靠近相机)的时候,就会替换Gbuffer里面的RGBA信息为要渲染的像素信息

3.什么是深度测试:两个指令,对比将要渲染的物体 的Z 值 对比 gbufffer 里面的值

ZWrite   On off

On: 是否将 要渲染的物体的深度 写入深度缓存区。
Off : 不往深度缓存去写入 深度值。

ZTest Less Always

Less :  将要渲染的物体的深度 要小于 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 Off
        ZWrite On  //往深度缓存区写入打开
        ZTest Always
        Pass
        {
            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 Off
        ZWrite On  //往深度缓存区写入打开
        ZTest Less
        Pass
        {
            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 Off
        ZWrite Off  //往深度缓存区写入关闭
        ZTest Less
        Pass
        {
            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 Off
        ZWrite Off  //往深度缓存区写入关闭
        ZTest Always
        Pass
        {
            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,0
            Color(1,0,0,1)
        }
    }
}
Shader "Hidden/OffsetRed"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
    }
    SubShader
    {
        Pass
        {
            Offset 0,0
            Color(0,1,0,1)
        }
    }
}


http://www.kler.cn/a/395863.html

相关文章:

  • 生成式GPT商品推荐:精准满足用户需求
  • 华为数字化转型的本质为何是管理变革
  • Elasticsearch retrievers 通常与 Elasticsearch 8.16.0 一起正式发布!
  • 【Qt聊天室客户端】消息功能--发布程序
  • goframe开发一个企业网站 统一返回响应码 18
  • vue动态列(表头)
  • 双指针优质算法题集
  • 基于STM32的智能语音识别饮水机系统设计
  • Ajax异步调用
  • css 溢出隐藏显示省略号
  • 地质旅游平台推动“旅游+地质”融合发展
  • Spring学习笔记_34——@Controller
  • 协方差矩阵及其计算方法
  • 动态规划 之 子数组 算法专题
  • Ceph 中PG与PGP的概述
  • Algen的跨链互操作性:增强区块链连接性
  • CSS Module:告别类名冲突,拥抱模块化样式(5)
  • 如何使用 WebAssembly 扩展后端应用
  • 0 -vscode搭建python环境教程参考(windows)
  • 【论文分享】三维景观格局如何影响城市居民的情绪
  • Vue3 虚拟列表组件库 virtual-list-vue3 的使用
  • JavaScript 单选框设置选中
  • 第5章-总体设计 5.2 需求转化为规格
  • java中设计模式的使用(持续更新中)
  • Mac解压包安装MongoDB8并设置launchd自启动
  • ‘视’不可挡:OAK相机助力无人机智控飞行!