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

二、深度测试(Z Test)

1.是什么

①从渲染管线出发

②书面上理解

所谓深度测试,就是针对当前对象在屏幕上(更准确的说是frame buffer)对应的像素点,讲对象自身的深度值与当前该像素点缓存的深度值进行比较,如果通过了,本对象再改像素点才会将颜色写入颜色缓冲区,否则不会写入颜色缓冲区

③逻辑上理解

④从发展上理解

2.深度缓冲区(Z-Buffer)

深度缓冲就像颜色缓冲(储存所有的片段颜色:视觉输出)一样,在每个片段中储存了信息,并且(通常)和颜色缓冲有着一样的宽度和高度。深度缓冲是由窗口系统自动创建的,它会以16、24或者32位float的形式存储它的深度值。在大部分的系统中,深度缓冲的精度都是24位的。

Z-Buffer中存储的是当前的深度信息,对于每个像素存储一个深度值。

通过Z Write和Z Test来调用用Z-Buffer,实现想要的渲染结果。

3.Z Write 和 Z Test

深度写入如包括两种状态:ZWrite On与ZWrite Off

当我们开启深度写入的时候,物体被渲染时针对物体在屏幕(更准确的说是frame buffer)上每个像素的深度都写入到深度缓冲区;反之,如果是ZWrite Off,那么物体的深度就不会写入深度缓冲区。但是,物体是否会写入深度,除了ZWrite这个状态外,更重要的是是需要深度测试通过,也就是ZTest通过,如果ZTest都没通过,那么也就不会写入深度了

Z Test比较操作:

默认ZWrite On和ZTest Lequal,深度缓存一开始为无穷大。

Z Test分为通过和不通过两种情况,ZWrite分为开启和关闭两种情况的话,一共就是四种情况,具体见下图。

4.深度测试流程

5.渲染队列

Unity中的集中内置的渲染队列,按照渲染顺序,从先到后进行排序,队列越小的,越先渲染,队列数越大的,越后渲染。

Unity中设置渲染队列:Tags{"Queue"="Transparent"},默认是Geometry。

    • 不透明物体的渲染顺序:从前往后
    • 透明物体的渲染顺序:从后往前
    • (更严谨说是不透明物体渲染:队列数值从小到大,透明物体渲染顺序:队列数值从大到小)

Unity中Inspector shader面板中查看队列:

6.简述Early-Z技术

传统渲染中,Z Test其实是在Blending阶段,这时候进行深度测试,所有对象的像素着色器都会计算一遍,没有什么性能提升,仅仅是为了得出正确的遮挡结果,会造成大量的无用计算,因为每个像素电商肯定重叠了很多计算。因此现代GPU中运用了Early-Z的技术,在Vertex阶段和Fragment阶段之间(光栅化之后,fragment之前)进行一次深度测试,如果深度测试失败,就不必进行fragment阶段的计算了,因此在性能上会有很大的提升。但是最终的Z Test仍然需要进行,以确保最终的遮挡关系结果正确。前面的一次主要是Z-Cull为了裁剪已达到优化的目的,后一次主要是Z-Check为了检查,如下图:

7.深度值

为什么深度缓冲区使用非线性深度?

参考链接深度测试 - LearnOpenGL-CN

8.深度测试总结

  • 使用深度缓冲区最重要的两个值:当前深度换重置(Z BufferValue)和深度参考值(Reference Value),并通过比较操作获取立项渲染效果。
  • Unity中的渲染顺序:西安许安然不透明物体,顺序是从前到后;在渲染透明物体,顺序是从后到前。
  • 通过Z Write和Z Test组合使用控制半透明物体的渲染。
  • 引入Early-Z技术后的深度测试相关的渲染流程。
  • 深度缓冲区古中存储的深度值为0到1范围的浮点值,切为非线性。

9.深度测试扩展

  • 基于深度的着色(湖水渲染)
  • 阴影忒图(ShadowMap)
  • 透明物体、粒子渲染
  • 透视X-Ray效果
  • 切边效果
  • 等等

参考链接:

Unity Shader-渲染队列,ZTest,ZWrite,Early-Z

learnopengl 深度测试

unity-shader深度测试-透视xray

《Unity ShaderLab开发实战详解》

《Unity Shader 入门精要》

Toon Water Shader


视频代码 Z-Test


http://www.lryc.cn/news/193781.html

相关文章:

  • Vue_Bug VUE-ADMIN-TEMPLATE-MASTER electron build后无法登录
  • 睡衣内衣服装商城小程序的作用是什么
  • idea怎么设置作者信息(详细)
  • 产品经理如何有效跟进开发进度?
  • 【已解决】Qt无法追踪到mouse移动事件
  • Dubbo从0到1——万字完整学习笔记
  • Rust初接触
  • shell脚本学习笔记03(小滴课堂)
  • 软件工程和计算机科学与技术学习方向区别
  • React常用hooks总结
  • 【算法学习】-【滑动窗口】-【找到字符串中所有字母异位词】
  • 利用python学习如何处理需要登录的网站
  • vue适配各个屏幕
  • 在conda创建的虚拟环境中安装jupyter以及使用
  • 【Java 8的新特性】
  • Android+Appium自动化测试环境搭建及实操
  • NetSuite ERP系统健康检查
  • 常用的数字格式代码
  • GitLab使用步骤
  • 基于MindSpore的llama微调在OpenI平台上运行
  • P34~36第八章相量法
  • WAF绕过-漏洞发现之代理池指纹探针 47
  • 模型预测控制(MPC)中考虑约束中的不确定性(Matlab代码实现)
  • 校招C#面试题整理—Unity客户端
  • 【数字IC设计】利用Design Compiler评估动态功耗
  • Docker Compose命令讲解+文件编写
  • Linux bash: ipconfig: command not found解决方法
  • 【面试算法——动态规划 21】正则表达式匹配(hard) 交错字符串
  • 基于Python实现的神经网络分类MNIST数据集
  • 设计模式之是简单工厂模式