首页 > 其他分享 >二、深度测试(Z Test)

二、深度测试(Z Test)

时间:2023-10-25 19:07:21浏览次数:40  
标签:渲染 队列 物体 缓冲区 测试 深度 Test


1.是什么

①从渲染管线出发

二、深度测试(Z Test)_Test

②书面上理解

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

③逻辑上理解

二、深度测试(Z Test)_深度测试_02

④从发展上理解

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比较操作:

二、深度测试(Z Test)_深度测试_03

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

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

4.深度测试流程

二、深度测试(Z Test)_像素点_04

5.渲染队列

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

二、深度测试(Z Test)_像素点_05

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

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

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

二、深度测试(Z Test)_Test_06

二、深度测试(Z Test)_Test_07

6.简述Early-Z技术

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

二、深度测试(Z Test)_深度测试_08

二、深度测试(Z Test)_Test_09

7.深度值

二、深度测试(Z Test)_像素点_10

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

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

8.深度测试总结

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

9.深度测试扩展

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

二、深度测试(Z Test)_深度测试_11


二、深度测试(Z Test)_深度测试_12

二、深度测试(Z Test)_像素点_13

二、深度测试(Z Test)_Test_14

参考链接:

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

learnopengl 深度测试

unity-shader深度测试-透视xray

《Unity ShaderLab开发实战详解》

《Unity Shader 入门精要》

Toon Water Shader


视频代码 Z-Test

二、深度测试(Z Test)_游戏_15

二、深度测试(Z Test)_深度测试_16

二、深度测试(Z Test)_像素点_17


标签:渲染,队列,物体,缓冲区,测试,深度,Test
From: https://blog.51cto.com/u_136836/8023714

相关文章

  • 3.1 模板测试与深度测试(Stencil Test & Z Test)
    一、模板测试(StencilTest)模板测试可以实现的一些效果图1.是什么①从渲染管线出发:模板测试是在逐片源操作阶段,透明测试之后,深度测试之前的位置。②从书面概念上理解说到模板测试,就要先说道模板缓冲区。模板缓冲区与颜色缓冲区和深度缓冲区类似,模板缓冲区可以为屏幕上的每个像素点保......
  • 一篇了解springboot3请求参数种类及接口测试
    SpringBoot3数据请求:原始数据请求://原始方式@RequestMapping("/simpleParam")publicStringsimpleParam(HttpServletRequestrequest){//获取请求参数Stringname=request.getParameter("name");Stringage=request.getParame......
  • 接口自动化--postman(7)批量运行测试用例,Postman参数化和数据驱动
    批量运行测试用例Postman参数化和数据驱动参数化:把数据用参数来代替,从而进行测试的过程。参数化是实现数据驱动测试的前置技术数据驱动:把测试数据和测试脚本分离,用数据来驱动测试用例的执行。简单的说,就是一条数据对应一条测试用例。  Postman实现数据驱动--支持的......
  • 《动手学深度学习 Pytorch版》 10.4 Bahdanau注意力
    10.4.1模型Bahdanau等人提出了一个没有严格单向对齐限制的可微注意力模型。在预测词元时,如果不是所有输入词元都相关,模型将仅对齐(或参与)输入序列中与当前预测相关的部分。这是通过将上下文变量视为注意力集中的输出来实现的。新的基于注意力的模型与9.7节中的模型相同,只不过......
  • pytest报错UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc3 in position 1
    报错UnicodeDecodeError:'utf-8'codeccan'tdecodebyte0xc3inposition11:invalidcontinuationbyte代码运行时,报错 可以看出是编码的问题,根据提示,有可能是__init__.py文件的问题,通过查看源代码:尝试改变"utf-8"为“gbk"路径:C:\python3.8\Lib\site-packages\inic......
  • 软件测试|pycharm关联GitHub的详细步骤
    简介GitHub是全球最大的开源代码托管平台之一,而PyCharm是一款强大的Python集成开发环境。将两者结合使用,可以提高团队协作和代码管理的效率。本文将详细介绍如何在PyCharm中管理GitHub账号,包括如何设置GitHub账号、创建新仓库、克隆现有仓库、提交和推送代码等。环境准......
  • 软件测试|Python数据可视化神器——pyecharts教程(十)
    使用pyecharts绘制漏斗图简介漏斗图(FunnelChart)是一种用于可视化数据流程或转化率的图表类型。它通常由一系列阶段组成,每个阶段都有一个名称和一个值,表示在该阶段的转化量或数据流程的进展情况。漏斗图的名称来源于其外观,类似于实际的漏斗形状,它的顶部较宽,底部较窄,符合数据逐渐减......
  • 软件兼容性测试对软件产品起到什么作用?CMA、CNAS软件测评中心分享
    软件兼容性测试是指检查软件之间能否正确地进行交互和共享信息。随着用户对来自各种类型软件之间共享数据能力和充分利用空间同时执行多个程序能力的要求,测试软件之间能否协作变得越来越重要。软件兼容性测试工作的目标是保证软件按照用户期望的方式进行交互。1、提高软件......
  • 软件系统测试和验收测试有什么联系和区别?湖南软件测评公司推荐
    卓码软件测评作为一家专业的软件测试服务提供商,我们深知软件系统测试和验收测试在软件开发过程中的重要性。本文将从多个角度出发,详细描述这两个测试的含义、联系和区别。一、什么是软件系统测试?软件系统测试是指对整个软件系统进行全面、全局的功能和性能验证的过程......
  • Python - 单元测试
    总结 一、如何进行单元测试注意点:importunittest需要创建一个类TestSort,继承类‘unittest.TestCase’然后,在这个类TestSort中定义相应的测试函数test_sort(),进行测试。注意,测试函数要以‘test’开头而测试函数的内部,通常使用assertEqual()、assertTrue()、assertFalse......