Unity Shader 学习14:模版测试 与 深度测试

server/2025/3/1 0:48:42/

        目录

一、模版检测

1. 概念

① 比较 Comp

② 更新 Pass

2. 示例分析 - 3D卡牌

二、深度检测

1. 概念

① 比较:深度测试 Z-Test

② 更新:深度写入 Z-Write

2. 示例分析


一、模版检测

核心:当前模版缓冲区中的值 [stencilBufferValue] 和 准备渲染的物体的模版参考值(我们设的) [referenceValue]比较默认情况下 只有通过比较才会渲染像素,否则抛弃

1. 概念

① 比较 Comp

这个比较可以用 大于等于小于不等于这些方式,或者直接了当地不管三七二十一,设为 永远通过 或者 永远不通过

② 更新 Pass

而模板测试结束时,可以分别选择在 通过或者没通过 的情况下,对当前缓冲区的值做不同的更新操作,比如默认情况就是,在通过时 替换 (replace) 缓冲区的值为物体的参考值。

2. 示例分析 - 3D卡牌

这样的3d卡牌的效果原因是,只有在这个卡面之内的区域后面的物体才能被看到,其余会被剔除。

而如果用模版测试来做的话,本质上有点类似于一个 “与”运算,在这里我画了一个下图,首先我给卡面所在的缓冲区区域给定永远都是1,然后再给小兔子的参考值也为1,此时我设定 只有物体参考值等于缓冲区的模版值时才能正常显示,那么就只有两者 相交同时为1 的区域会被显示了。

  • 因此卡面的模版测试为:让该区域缓冲区永远为1(这里的_ID假设是1)
Stencil{Ref [_ID]Comp AlwaysPass replace
}
  • 后面物体的模版测试为:我也设为1(_ID假设也是1),只有与缓冲区相同时我再通过测试
Stencil{Ref [_ID]Comp equal
}

这样就能实现3D卡牌的效果了,但是有几个细节需要注意:
渲染队列:设置卡面的渲染队列为 "Geometry+1",后面物体的渲染队列为 "Geometry+2",要先渲染卡面再渲染后面的物体,才能按我们想要的顺序进行模版比较。
深度写入:卡面要取消深度写入,因为他是挡在前面的,后面的物体需要透过它显示。

卡面
后面物体


二、深度检测

1. 概念

① 比较:深度测试 Z-Test

深度检测是在模版测试之后进行的测试,这是一个处理物体互相遮挡关系的过程,默认情况下,只有深度值小等于缓冲区中深度值的像素才能被渲染。

这里需要区分两个概念:深度值渲染队列
深度值越大表示越远,而渲染队列(直观层面上)是值越小表示越远。

② 更新:深度写入 Z-Write

在 Z-Test 之后,还要进行 Z-Write 。他们俩同时决定数据是否会被写入 深度缓冲区 以及 颜色缓冲区

当深度测试都不通过的时候,不管深度写入是否开启,都不会写入两个缓冲区。
而深度测试通过时,如果Z-Write开启,则两个都写入;否则只写入颜色缓冲区。
 

2. 示例分析

简单分析一下,这个兔兔被前面遮挡的物体拆成了两个部分来渲染,一个是没遮挡部分 - 正常渲染(Normal),另一个是遮挡部分 - 做视觉处理(Xray),需要两个pass来实现。

正常部分 全按默认值设 或者 不设 就好: ZTest LEqual    ZWrite on
Xray部分 则相反,当它在更深的时候渲染,并且不写入深度: ZTest Greater   ZWrite off


http://www.ppmy.cn/server/171425.html

相关文章

2步本地安装部署国产之光大模型DeepSeek,附Mac安装教程和安装包!

轻松两步本地运行国产大模型DeepSeek,附Windows与Mac教程及安装包! 在短短一夜之间,DeepSeek-R1,中国的AI大模型,以惊人的速度崛起,引发了全球科技界的广泛关注。英伟达AI科学家Jim Fan也对此表示惊讶&…

子组件如何通过v-model实现数据的双向绑定

在 Vue 中,v-model 是一种语法糖,用于在表单元素或者组件上实现双向数据绑定。 下面分别介绍在 Vue 2 和 Vue 3 里子组件使用 v-model 实现数据双向绑定的具体方式。 Vue 2 中使用 v-model 实现双向绑定 在 Vue 2 里,v-model 本质上是 :va…

服务异步通讯与RabbitMQ

服务异步通讯 文章目录 服务异步通讯MQRabbitMQ1、安装(部署)2、结构3、消息模型4、SpringAMQP4.1、基本消息队列4.2、工作消息队列4.3、发布订阅模型4.3.1、FanoutExchange(广播类型的交换机)4.3.2、DirectExchange(路…

【Redis】在Java中以及Spring环境下操作Redis

Java环境下&#xff1a; 1.创建maven 项目 2.导入依赖 <!-- redis --><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>4.3.2</version></dependency> 此处使用的是Jedis&…

Buildroot 添加自定义模块-内置文件到文件系统

目录 概述实现步骤1. 创建包目录和文件结构2. 配置 Config.in3. 定义 cp_bin_files.mk4. 添加源文件install.shmy.conf 5. 配置与编译 概述 Buildroot 是一个高度可定制和模块化的嵌入式 Linux 构建系统&#xff0c;适用于从简单到复杂的各种嵌入式项目. buildroot的源码中bui…

五、AIGC大模型_04LLaMA-Factory基础知识与SFT实战

1、LLaMA-Factory 基本介绍 1.1 定义 LLaMA-Factory 是一个开源的大型语言模型&#xff08;LLM&#xff09;微调框架&#xff0c;旨在帮助开发者和研究人员轻松地对预训练语言模型进行定制化训练和优化 1.2 功能特点 支持多种预训练模型 LLaMA Factory 支持超过 100 种主流的…

2025年信息科学与工程学院科协机器学习介绍——机器学习基本模型介绍

机器学习 目录 机器学习一.安装基本环境conda/miniconda环境 二.数据操作数据预处理一维数组二维数组以及多维数组的认识访问元素的方法torch中tenson的应用张量的运算张量的广播 三.线性代数相关知识四.线性回归SoftMax回归问题&#xff08;分类问题&#xff09;什么是分类问题…

面试问题——如何解决移动端1px 边框问题?

面试问题——如何解决移动端1px 边框问题&#xff1f; 最近&#xff0c;不少小伙伴向我反映&#xff0c;他们在面试中频繁被问到关于1px边框的问题。这个看似老生常谈的话题&#xff0c;没想到在面试中的出现率依然这么高&#xff0c;着实让我有些意外。对于那些对这个问题感到…