TA百人计划学习笔记 3.1.2深度测试

  • 资料
    • 源视频
      • 【技术美术百人计划】图形 3.1 深度与模板测试 传送门效果示例_哔哩哔哩_bilibili
    • ppt
      • 3100-模板测试与深度测试(1)
    • 参考
      • Unity Shader: 理解Stencil buffer并将它用于一些实战案例(描边,多边形填充,反射区域限定,阴影体shadow volume阴影渲染)_unity stencil buffer-CSDN博客
      • 3.1 模板测试和深度测试 · 语雀
    • MayoHa Wu - 知乎
  • Z test(depth test) 深度测试
    • 引入
    • 是什么
      • 从渲染管线理解
        • 深度测试同样位于逐片元操作过程中,在模板测试之后,透明度混合之前。
      • 从逻辑上理解
        • 和模板测试差不多,都是通过一个比较来判断一系列操作
        •  
          • 如果ZWrite On,且当前深度值和深度缓冲区的值作比较,如果通过就写入深度,不通过就忽略深度
        •  
          • 当前深度值和深度缓冲区中的值做比较,如果通过就写入颜色缓冲区,不通过就不写入颜色缓冲区
      • 从书面概念上理解
        • 就是针对当前屏幕上(更准确的说是FrameBuffer)对应的像素点,将对象自身的深度值与当前深度缓冲区的深度值做比较,如果通过了,这个对象在该像素点才会将颜色写入颜色缓冲区
      • 从发展上看
        •  
          • 控制渲染顺序
            • 画家算法:
              • 这里是指油画的画法,也就是画一幅油画,是从远处开始画,然后近处的东西一点点叠加在上面
              • 存在的问题:例如一列物体,最前面的物体最大,站在正前面看只能看到最前面的物体,这样一来后边的就不用画了,不然就是性能浪费(OverDraw)。
            • Z-Buffer算法:
              • 通过深度缓冲区来控制渲染顺序
          • 控制Z-Buffer对深度的存储
            • 例如:什么时候更新深度缓冲区、什么时候使用深度缓冲区
            • 两个典型的功能:
              • Z Test
              • Z Write
          • 控制不同类型物体的渲染顺序
            • 透明物体
            • 不透明物体
            • 渲染队列
          • 减少OverDraw
            • Early-Z
            • Z-cull(优化手段)
            • Z-check(确认正确遮挡关系)
    • 原理和方法
      • Z-Buffer(深度缓冲区)
        • 和颜色缓冲区一样,在每个片段中存储了信息,并且通常和颜色缓冲有着一样的宽度和高度
          • 颜色缓冲区:
            • 就是最终在显示屏硬件上显示颜色的GPU显存区域了,这个缓冲区储存了每帧更新后的最终颜色值,图形流水线经过一系列测试,包括片段丢弃、颜色混合等,最终生成的像素颜色值就储存在这里,然后提交给显示硬件显示。
        • 深度缓冲是由窗口系统自动创建的,它会以16、24、32位float形式存储深度值。
          • //大部分系统中深度值是24位的
        • Z-Buffer中存储的是当前的深度信息,对于每个像素存储一个深度值。
          • 我们可以通过Z-Write 、Z-Test来调用Z-Buffer,来达到想要的渲染效果
      • Z Writer(深度写入)
        • 深度写入包括两种状态
          • ZWrite On
            • 当我们开启深度写入,物体被渲染时针对物体在屏幕(FrameBuffer)上每个像素的深度都写入到深度缓冲区。
          • ZWrite Off
            • 关闭深度写入状态,物体的深度就不会写入深度缓冲区。
        • 只有ZTest和ZWrite都可行的情况下才写入深度缓冲区
          •  
            • 除了ZWrite的是否写入深度缓冲区,更重要的是:是否通过深度测试,也就是Z-Test
            • 如果Z-Test都没通过,也就不会写入深度了。
            • 综上,ZWrite有On、Off两种情况;ZTest有通过、不通过两种情况,两者结合的四种情况如下:
      • Z-Test的比较函数
        •  
          • 默认情况下:
            • Z Write:On
            • Z Test:LEqual
            • 深度缓冲一开始为无穷大
      • Unity的渲染队列
        • Unity内置的几种渲染队列:
          •  
            • 按照渲染顺序从先到后排序,队列数越小,越先渲染;反之同理。
            • BUT
              • Unity中透明物体的渲染顺序:从后往前(类似画家算法,会造成OverDraw)
              • Unity中不透明物体的渲染顺序:从前往后
                • 也就是说深度小的先渲染,其次再渲染深度大的
        • Unity中设置渲染队列:
          • 语法:Tags { “Queue” = “渲染队列名”}
            • 默认是Geometry
          • 可以在shader的Inspector面板中查看渲染队列相关属性
      • 简述Early-Z技术
        • early
          • adv. 提前;提早;在早期;在初期
          • adj. 早期的;初期的;早先的;早到的
        •  
          • 三角形遍历之后、片元着色器(像素着色器)之前。
          • 传统的渲染管线中,ZTest是在Blending阶段,这时进行深度测试的话,所以对象的像素着色器都会计算一遍,没有性能提升,只是为了得到正确的效果,造成了大量的无用计算。(深度测试失败的片元是经过片元着色器计算的片元,也就是说:到在ZTest不通过而被抛弃,前边的计算就是无用功了)
        •  
          • Z-Cull是为了筛选片元达到性能优化的目的
          • Z-check是为了保证正确的遮挡关系。
      • 深度值
        • 模型在渲染管线中的几次空间变换
          •  
            • 最后通过一些投影映射变换到屏幕空间
        • 为什么深度缓冲区中要存储一个非线性的深度?
          • 适应人眼
          • 避免深度冲突
          • 深度测试 - LearnOpenGL-CN
    • 效果
      • 案例一
        • 三个正方体遮挡关系
        • shader
          • code
        • 在frame debug中查看渲染顺序
      • 案例二 X-Ray效果
        •  
          • 实现思路:
            • shader的多pass
              • pass0
                • X-Ray效果使用ZTest :Greater,关闭深度写入
              • pass1
                • 默认的渲染:LEqual、ZWrite On
        • shader
          • 相关概念
            • CGINCLUDE与pass
              • Unity着色器CGINCLUDE与pass复用_shader pass 复用-CSDN博客
            • blend混合模式
              • 庄懂Lesson13
              • 《shader入门精要》8章
          • code
            •  
              • Cull back 是剔除背面,为了优化
              • Blend SrcAlpha One :由于有一个透明的效果,除了上边的,还需要一步Blend,来做透明度混合
      • 拓展
  • 参考资料
    • Unity Shader-渲染队列,ZTest,ZWrite,Early-Z_unity shader ztest zclip-CSDN博客
    • 深度测试 - LearnOpenGL-CN
    • ShaderLab: Culling & Depth Testing - Unity 手册
    • unity-shader深度测试-透视xray_unity如何实现图片透视-CSDN博客
    • Unity Toon Water Shader Tutorial
    • 《shader入门精要》
    • 《Unity ShaderLab 开发实战详解》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/345914.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[ACM学习] 树形dp之换根

算法概述 总的来说: 题目描述:一棵树求哪一个节点为根时,XXX最大或最小 分为两步:1. 树形dp 2. 第二次dfs 问题引入 如果暴力就是 O(n^2) , 当从1到2的时候,2及其子树所有的深度都减一,其它…

UI自动化Selenium BeautifulReport报告中展示用例描述

BeautifulReport安装并运行后,发现用例描述为空NULL;怎么定义每个Testcase的用例描述并展示在报告中呢? 其实很简单: 只需要在每个测试方法第一行加上注释内容 即可; 当然也可以通过ddt 方式 在Excel中定义好用例描述…

sprignboot电商书城源码

运行环境: jdk1.8,maven,mysql 项目技术: 后台主要是springbootmybatisshirojsp,前端界面主要使用bootstrap框架搭建,并使用了ueditor富文本编辑器、highcharts图表库。 有需要的可以联系我。 功能介绍: 该系统分为前台展示和后台管理两…

【数据结构】 链队列的基本操作 (C语言版)

目录 一、链队列 1、链栈的定义: 2、链栈的优缺点: 二、链队列的基本操作算法(C语言) 1、宏定义 2、创建结构体 3、链栈的初始化 4、链队列的入队 5、链队列的出队 6、取链队列的对头元素 7、链队列的销毁 8、链…

Minio 判断对象是否存在

引 Minio数据模型 中描述了 MinIO 中什么是桶,什么是对象,也给出了操作桶和操作对象的API。 在 MinIO 中, 对象 中间前缀 对象名称 。如何判定对象是否存在呢? 分析 在 MinIO 中并没有提供判断对象是否存在的操作&#xff…

leetcode:排序链表(递归)

题目: 给定链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。 示例 1: 输入:head [4,2,1,3] 输出:[1,2,3,4]示例 2: 输入:head [-1,5,3,4,0] 输出:[-1,0,3,4,5]示例…

【原创】linux为什么不是实时操作系统

文章目录 一、什么是实时操作系统(RTOS)?二、linux为什么不是实时操作系统?中断响应时间中断处理时间任务调度时间1、No Forced Preemption(Server)2、Voluntary Kernel Preemption(Desktop)3、Preemptible Kernel(Low-Latency De…

yarn集群HDFS datanode无法启动问题排查

一、问题场景 hdfs无法访问,通过jps命令查看进程,发现namenode启动成功,但是所有datanode都没有启动,重启集群(start-dfs.sh)后仍然一样 二、原因分析 先看下启动的日志有无报错。打开Hadoop的日志目录 …

Java实现考研专业课程管理系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 考研高校模块2.3 高校教师管理模块2.4 考研专业模块2.5 考研政策模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 考研高校表3.2.2 高校教师表3.2.3 考研专业表3.2.4 考研政策表 四、系统展示五、核…

系统登录的时候的密码如何做到以加密的形式进行登录【java.security包下的api】工具类。

/** description: 将普通的publicKey转化得到一个RSAPublicKey* author: zkw* date: 2024/1/24 16:17* param: publicKey 普通的publicKey* return: RSAPublicKey 得到一个新的RSAPublicKey**/public static RSAPublicKey getPublicKey(String publicKey) throws NoSuchAlgorit…

【进阶之路】如何提升 Java 编程内力?

如何提升 Java 编程内力? 可能很多初学者在学完 SpringBoot 之后,做了 1-2 个项目之后,不知道该去学习什么了,其实这时候需要去学习的东西还有很多,接下来我会列举一下主要需要从哪些方面来对 Java 编程深入学习&#…

C++补充篇- C++11 及其它特性

目录 explicit 关键字 左值和右值的概念 函数返回值当引用 C11 新增容器 - array C的类型转换 static_cast reinterpret_cast dynamic_cast const_cast C智能指针 auto_ptr 使用详解 (C98) unique_ptr 使用详解 (C11) auto_ptr的弊端 unique_ptr严谨auto_ptr的弊端 unique_…

网安培训第二期——sql注入+中间件+工具

文章目录 宽字节注入插入注入二次注入PDO模式(动态靶机!!!!!!!)sql注入读取文件sql注入导出文件linux命令 10.12笔记sqlmapsqlmap参数 10.13笔记sqlmap 文件读写前后缀常用tamper及适用场景 10.…

SpringMVC-RESTFul

文章目录 RESTFul一、基础概念二、增删改查1.查询全部用户信息 (GET)2.根据id查询用户信息3.添加用户(POST)4.修改用户 (PUT)5.删除用户 (DELETE) RESTFul 一、基础概念 二、增删改…

Qt Designer教程

文章目录 创建一个 ui 文件选择控件Qt Designer基本控件介绍1、Layouts1.1、Layouts 布局1.2、参数配置 2、Spacers2.1、 Spacers 弹簧介绍2.2、 参数设置 3、Buttons 按键3.1、 Buttons 按键分类 4、Item Views(Model-Based) 项目视图(基于模型)4.1、 B…

高质量简历模板网站,免费、免费、免费

你们在制作简历时,是不是基本只关注两件事:简历模板,还有基本信息的填写。 当你再次坐下来更新你的简历时,可能会发现自己不自觉地选择了那个“看起来最好看的模板”,填写基本信息,却没有深入思考如何使简历…

shell脚本基础之条件语句详解

目录 一、条件语句 1、测试 1.1 测试判断 ​1.2 比较整数数值 1.3 字符串比较 1.4 双中括号的用法 1.5 () 与 {} 的用法及区别 2、if语句 2.1 单分支if语句 2.2 双分支if语句 2.3 多分支if语句 2.4 shell脚本的if语句案例 案例一 案例二 案例三 案例四 案例五…

c++day1作业

思维导图 提示并输入一个字符串&#xff0c;统计该字符中大写、小写字母个数、数字个数、空格个数以及其他字符个数 要求使用C风格字符串完成 #include <iostream> #include <iomanip> using namespace std; int main() {string a;cout<<"输入一个字符…

vue3-深入组件-组件注册和props更多细节

组件注册 定义好的组件需要注册才能被使用。 注册方式有两种 全局注册 局部注册 全局注册 .component() 方法&#xff0c;让组件在当前 Vue 应用中全局可用。 在 main.ts 中 import ./assets/main.cssimport { createApp } from vue import { createPinia } from pinia i…

一带一路暨金砖国家技能发展国际联盟大数据和人工智能专业委员会名单

四川城市职业学院和陈老师在序号&#xff1a;158&#xff0c;300 一带一路暨金砖国家技能发展国际联盟大数据和人工智能专业委员会名单 各相关单位&#xff1a; 一带一路暨金砖国家技能发展国际联盟大数据和人工智能专业委员会于2023年11月12日正式成立。经各单位申请、大数据…