Unity中Shader的深度测试ZTest

news/2024/10/17 14:13:56/

文章目录

  • 前言
  • 一、深度测试是干什么的
  • 二、图示讲解深度测试的作用
  • 三、深度值的测试操作
    • 1、设置为测试不通过,看看效果
    • 2、使用开关控制是否开启深度测试


前言

Unity中Shader的深度测试ZTest


一、深度测试是干什么的

通俗的讲,深度测试就是颜色在写入颜色缓冲区前,对其做出一些判断
通过测试的加入颜色缓冲区,没有通过测试的就舍弃


二、图示讲解深度测试的作用

在这里插入图片描述
图中
蓝色矩形先渲染
红色矩形后渲染
渲染测试采用默认的小于等于
深度测试蓝色矩形时,深度值 0.4 < 1,通过测试,全部部分加入 颜色缓冲区
深度测试红色矩形时,深度值 0.6 只有小于 1 的部分通过测试, 大于 0.4 的部分不通过测试
所以,最后的效果呈现 蓝色矩形 在 红色矩形前


三、深度值的测试操作

ZTest(Less | LEqual | GEqual | Equal | NotEqual | Never | Always)

1、设置为测试不通过,看看效果

ZTest Never

在这里插入图片描述

2、使用开关控制是否开启深度测试

Unity封装好的枚举方法:UnityEngine.Rendering.CompareFunction

属性面板:[Enum(UnityEngine.Rendering.CompareFunction)]_ZTest(“ZTest”,int) = 0

SubShader: ZTest [_ZTest]

效果:
请添加图片描述

最终代码:

Shader "MyShader/P1_6_3"
{Properties{[Enum(Off,0,On,1)]_ZWrite("ZWrite",int) = 0[Enum(UnityEngine.Rendering.CompareFunction)]_ZTest("ZTest",int) = 0//使用这个标签,可以使外部暴露属性,有标题[Header(Base)][NoScaleOffset]_MainTex ("Texture", 2D) = "white" {}_Clip("Clip",Range(0,1)) = 0//使用这个标签可以 在两行暴露属性之间加 间隙[Space(10)][Header(Dissolve)]_DissolveTex("DissolveTex",2D) = "black"{}[NoScaleOffset]_RampTex("RampTex(RGB)",2D) = "black" {}}SubShader{Tags{"Queue" = "Geometry"}Blend OffCull BackZWrite [_ZWrite]ZTest [_ZTest]Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"sampler2D _MainTex;float _Clip;sampler2D _DissolveTex; //这个四维向量,xyzw分别表示 Tilling 和 Offset 的 xy ,命名方式 在纹理名 后加 _STfloat4 _DissolveTex_ST;//因为 在使用渐变纹理时,只使用了 渐变纹理的 u 坐标,所以把  sampler2D 换为 samplersampler _RampTex;struct appdata{float4 vertex : POSITION;float4 uv : TEXCOORD0;};struct v2f{float4 uv : TEXCOORD0;float4 pos : SV_POSITION;};v2f vert (appdata v){v2f o;o.pos = UnityObjectToClipPos(v.vertex);//为了减少传入的值 ,所以就不创建新变量来存储,而是把 uv 改为  四维向量 来用//使用 o.uv 的 xy 来存放 原人物贴图//使用 o.uv 的 zw 来存放 噪波贴图缩放 和 偏移 后的值o.uv.xy = v.uv.xy;//o.uv.zw = v.uv * _DissolveTex_ST.xy + _DissolveTex_ST.zw;o.uv.zw = TRANSFORM_TEX(v.uv,_DissolveTex);return o;}fixed4 frag (v2f i) : SV_Target{fixed4 col = tex2D(_MainTex, i.uv.xy);//外部获取的 纹理 ,使用前都需要采样fixed4 dissolveTex = tex2D(_DissolveTex,i.uv.zw);//片段的取舍clip(dissolveTex.r -  _Clip);//进行归一化fixed4 dissolveValue = saturate((dissolveTex.r - _Clip) / (_Clip + 0.1 - _Clip));fixed4 rampTex = tex1D(_RampTex,dissolveValue.r);//col += rampTex;return col;}ENDCG}}
}

http://www.ppmy.cn/news/1158617.html

相关文章

4.2 网际协议IP

思维导图&#xff1a; 前言&#xff1a; **笔记 4.2 - 网际协议IP** 1. **定义与重要性**&#xff1a; - 网际协议IP是TCP/IP体系中的核心协议之一。 - 它是互联网的关键标准协议。 2. **发展背景**&#xff1a; - 又被称为Kahn-Cerf协议。 - 由Robert Kahn和…

【前端设计模式】之解释器模式

解释器模式是一种行为设计模式&#xff0c;它用于解释特定语言或规则的表达式。在前端开发中&#xff0c;解释器模式可以用于处理复杂的逻辑或规则&#xff0c;并将其转化为可执行的代码。 解释器模式特性 定义语言规则&#xff1a;解释器模式通过定义语言规则来解析和执行表…

C#内映射lua表

都是通过同一个方法得到的 例如得到List List<int> list LuaMgr.GetInstance().Global.Get<List<int>>("testList"); 只要把Get的泛型换成对应的类型即可 得到Dictionnary Dictionary<string, int> dic2 LuaMgr.GetInstance().Global…

探索未来:硬件架构之路

文章目录 &#x1f31f; 硬件架构&#x1f34a; 基本概念&#x1f34a; 设计原则&#x1f34a; 应用场景&#x1f34a; 结论 &#x1f4d5;我是廖志伟&#xff0c;一名Java开发工程师、Java领域优质创作者、CSDN博客专家、51CTO专家博主、阿里云专家博主、清华大学出版社签约作…

STM32 Cube SPI通信实战开发调试--电源项目SPI通信

文章目录 STM32 Cube SPI通信实战开发调试--电源项目SPI通信 STM32 Cube SPI通信实战开发调试–电源项目SPI通信 文章目录 准备工作 1.1. 所用硬件 1.2. SPI 简介 1.3. 生成工程 1.3.1. 创建工程选择主控 1.3.2. 系统配置 1.3.3. 配置工程目录 读写EEPROM实验&#xff08;W25…

开源原生android的视频编辑软件

videoEditAndroid 介绍 开源原生android的视频编辑软件 本人android 新手,也是边写边学习中,感觉写的很乱&#xff0c;功能虽已实现,但是会不断优化代码 也欢迎有兴趣的小伙伴加入 码农不易&#xff0c;欢迎 star 项目页面功能完成列表 视频选择(待完善) 静音 视频编辑 导…

《持续交付:发布可靠软件的系统方法》- 读书笔记(五)

持续交付&#xff1a;发布可靠软件的系统方法&#xff08;五&#xff09; 第二部分——部署流水线第 5 章 部署流水线解析5.1 引言5.2 什么是部署流水线5.3 部署流水线的相关实践5.3.1 只生成一次二进制包5.3.2 对不同环境采用同一部署方式5.3.3 对部署进行冒烟测试5.3.4 向生产…

(三十四)大数据实战——scala运行环境安装配置及IDEA开发工具集成

前言 本节内容我们主要介绍一下scala运行环境的安装配置以及在idea开发工具中集成scala插件&#xff0c;便于scala项目的开发。 在开始scala安装配置之前&#xff0c;我们要先安装好jvm运行环境&#xff0c;scala运行于Java虚拟机&#xff08;JVM&#xff09;上&#xff0c;并…