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 开发实战详解》

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

文字转语音在线合成掩码系统 让你的文字自动转为语音 带完整的安装部署教程

互联网的快速发展,人们对文字转语音(TTS)的需求日益增长。无论是需要为视障人士提供语音阅读的内容,还是想要为视频内容添加语音旁白,都需要一个高效、准确的文字转语音系统。然而,市面上的许多TTS工具都存…

是用原生js创建红包雨效果

需求: 创建红包雨 答案: // 红包雨代码 开始 // 添加遮罩层 const addOverlay () > {const overlay document.createElement(div);overlay.className overlay;overlay.style.position fixed;overlay.style.top 0;overlay.style.left 0;overlay.style.width 100%;o…

Unity_使用Image和脚本生成虚线段

生成如图样式的虚线段 原理:使用Image做一条线段,这个方法的原理就是给固定的片元长度,对Image进行分割,把片元添加到一个列表中,然后循环对列表中的偶数位进行隐藏,也可以调整线段的宽度 缺陷&#xff1…

无公网IP实现远程访问MongoDB文件数据库【内网穿透】

最近,我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念,而且内容风趣幽默。我觉得它对大家可能会有所帮助,所以我在此分享。点击这里跳转到网站。 文章目录 前言1. 安装数据库2. 内网穿透2.1 安装cpolar内网穿透2…

支持向量机(SVM)详解

支持向量机(support vector machines,SVM)是一种二分类模型。它的基本模型是定义在特征空间上的间隔最大的线性分类器,间隔最大使它有别于感知机。 1、线性可分支持向量机与硬间隔最大化 1.1、线性可分支持向量机 考虑一个二分…

Disruptor挖坑MemoryAnalyzer来填

Disruptor挖坑MemoryAnalyzer来填 1、起因背景2、初步定位3、细化定位3.1、内存文件导出命令3.2、MemoryAnalyzer分析xxx.hprof文件 4、思考5、花絮 1、起因背景 博主练手写的并发项目订单服务出现了程序一直处于加载未完成的状态,电脑温度升高,CPU使用…

springboot125汽车资讯网站

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的125汽车资讯网站 适用于计算机类毕业设计,课程设计参考与学习用途。仅供学习参考, 不得用于商业或者非法用途,否则,一切后果请用户自负。 看运行截图看 第五章 第四章 获…

springboot家乡特色推荐系统源码和论文

在Internet高速发展的今天,我们生活的各个领域都涉及到计算机的应用,其中包括家乡特色推荐的网络应用,在外国家乡特色推荐系统已经是很普遍的方式,不过国内的管理网站可能还处于起步阶段。家乡特色推荐系统采用java技术&#xff0…

UDS Flash刷写用例简单介绍

文章目录 1.Boot的功能1.1 目的1.2 功能 2.测试用例设计2.1 设计框架2.2 正向测试2.1.1 刷写流程2.1.2 重复刷写2.1.3压力刷写 2.3 逆向测试2.2.1 断电后刷写2.2.2 中断通讯后刷写2.2.3 篡改刷写数据2.2.4 修改软件校验数据2.2.5 修改刷写流程2.2.6 高负载刷写2.2.7 高低压刷写…

JuiceSSH结合内网穿透实现移动端设备公网远程访问Linux虚拟机

文章目录 1. Linux安装cpolar2. 创建公网SSH连接地址3. JuiceSSH公网远程连接4. 固定连接SSH公网地址5. SSH固定地址连接测试 处于内网的虚拟机如何被外网访问呢?如何手机就能访问虚拟机呢? cpolarJuiceSSH 实现手机端远程连接Linux虚拟机(内网穿透,手机端连接Linux虚拟机) …

Linux下安装 Redis7

Linux下安装 Redis7 三、Linux下安装 Redis7【redis-7.2.4.tar.gz】3.1.下载redis的安装包3.1.1.手动下载Redis压缩包并上传【redis-7.2.4.tar.gz】3.1.2.wget工具下载redis-7.2.4.tar.gz 3.2.将安装包进行解压缩3.3.进入redis的安装包3.4.检查是否有gcc 环境3.5.编译和安装并指…

VS Code C++ 开发:入门和 IntelliSense 配置

你是否在满天星空下琢磨如何在 VS Code 中配置用于 C 开发的智能感知功能(IntelliSense)? 你是否想知道,有没有一种最简单的方法来运行你的 C 代码? 好消息是:我们在 C 扩展中添加了一些新功能,有了这些好东西&#xf…

Redis——关于它为什么快?使用场景?以及使用方式?为何引入多线程?

目录 1.既然redis那么快,为什么不用它做主数据库,只用它做缓存? 2.Redis 一般在什么场合下使用? 3.redis为什么这么快? 4.Redis为什么要引入了多线程? 1.既然redis那么快,为什么不用它做主数据…

解决Sublime Text V3.2.2中文乱码问题

目录 中文乱码出现情形通过安装插件来解决乱码问题 中文乱码出现情形 打开一个中文txt文件,显示乱码,在File->Reopen With Encoding里面找不到支持简体中文正常显示的编码选项。 通过安装插件来解决乱码问题 安装Package Control插件 打开Tool->…

Windows本地如何部署Jupyter+Notebook并结合内网穿透实现远程访问?

文章目录 1.前言2.Jupyter Notebook的安装2.1 Jupyter Notebook下载安装2.2 Jupyter Notebook的配置2.3 Cpolar下载安装 3.Cpolar端口设置3.1 Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1.前言 在数据分析工作中,使用最多的无疑就是各种函数、图表、…

2024全网超全的测试类型详解,再也不怕面试答不出来了!

在软件测试工作过程中或者在面试过程中经常会被问到一些看起来简单但是总是有些回答不上的问题,比如你说说“黑盒测试和白盒测试的区别?”,“你们公司做灰度测试么?", ”α测试和β测试有什么不一样?“&#xff0…

MVC模式

Model-View-Controller : 模型-视图-控制器模式,用于应用程序的分层开发。 Model(模型):代表一个存取数据的对象。也可以带有逻辑,在数据变化时更新控制器。 View(视图):代表模型包含的数据的可视化。 Controller(控制器)&#xf…

C/C++ - 编程语法特性

目录 标准控制台框架 输入输出对象 命名空间 标准控制台框架 头文件 ​#include <iostream>​​ 告诉编译器我们要使用iostream库尖括号中的名字指定了某个头文件(header) 入口函数 ​int main(void)​​ 返回 ​return 0;​​ 输出语句 ​std::cout << "H…

代码随想录 Leetcode111. 二叉树的最小深度

题目&#xff1a; 代码(首刷自解 2024年1月24日&#xff09;&#xff1a; class Solution { public:int minDepth(TreeNode* root) {if(root nullptr) return 0;queue<TreeNode*> que;TreeNode* cur root;que.push(cur);int size 0;int depth 0;while (!que.empty()…

力扣hot100 螺旋矩阵 模拟

Problem: 54. 螺旋矩阵 文章目录 思路&#x1f496; 收缩边界法 思路 &#x1f468;‍&#x1f3eb; 参考题解 &#x1f496; 收缩边界法 ⏰ 时间复杂度: O ( n m ) O(nm) O(nm) &#x1f30e; 空间复杂度: O ( 1 ) O(1) O(1) class Solution {public List<Integer&g…