[自学记录05|百人计划]Early-Z和Z-Prepass

news2025/1/19 23:22:39

其实这篇我是不想写的,因为网上资料真的非常非常多很多人都写过,但是我后来想了想,做笔记不就是这样吗,所以就写吧~。前置知识:深度测试Z-Buffer[计算机图形学]可见性与遮挡,Z-Buffer(前瞻预习/复习回顾)__Yhisken的博客-CSDN博客

一、Early-Z

Early-Z顾名思义,中文就是提前深度测试。在传统渲染管线中,我们知道深度测试是在片元着色器之后的,这会造成一个问题,已经处理好的许多片元因为可见性都被剔除了,那片元着色器岂不是白干了?也就是说者会造成大量的浪费。这种现象我们叫Overdraw,也就是过度绘制,在许多情况下渲染管线的各个环节都可能会出现这种情况。

因此为了避免上述这种情况,人们发明了Early-Z,它和深度测试基本没有区别,只有顺序不同,也就是把它插在了片元着色器的前面,这样我们就能先剔除,再交给片元着色器处理。现代的GPU已经都开始包含这样的硬件设计。

当然,Early-Z也存在诸多问题。

Early-Z的问题

1. Early-Z的优化效果并不稳定,最理想条件下所有绘制顺序都是由近及远,那么Early-Z可以完全避免过度绘制。但是相反的状态下,则会起不到任何效果。所以有些时候为了完全发挥Early-Z的功效,我们会在每帧绘制时对场景的物体按照到摄像机的距离由远及近进行排序。这个操作会在CPU端进行,当场景复杂到一定程度,频繁的排序将会占用CPU的大量计算资源。

2. 在以下几种情况下,Early-Z会失效                                                

开启Alpha Test 或 clip/discard 等手动丢弃片元操作

手动修改GPU插值得到的深度

开启Alpha Blend

关闭深度测试Depth Test

这几种情况下,GPU就会关闭Early-Z直到下次Clear Z-Buffer后才会重启。(但现在的GPU也在逐渐优化,使其更智能开关Early-Z)原因是因为如果进行这些操作可能会在片元着色器和真正的深度测试阶段修改深度缓存中的深度值,导致最后渲染结果不正确,熟悉半透明渲染的话应该很容易理解这一点。
 

二、Z-Prepass

Z-Prepass需要搭配Early-Z使用,思路如上图所示。简单的说就是分为两个Pass:第一个Pass仅写入深度,不做任何复杂的片元计算,不输出任何颜色。第二个Pass关闭深度写入,并将深度比较函数设为“相等”。这样就清晰许多了,我们第一个Pass提前绘制好深度图,然后第二个Pass在Early-Z阶段,由于我们已经把深度测试函数改为了相等,所以经过Early-Z之后,我们只保留了和深度图深度相等的片元,只有这些片元会进入片元着色器,这样就减少了我们前面提到的Overdraw。

1.Z-Prepass的问题

(1)动态批处理问题

拥有多个Pass的Shader无法进行动态批处理,会产生额外的Draw Call,造成大量的set pass call的开销。

(2)动态批处理问题的解决方法

仍然使用两个Pass,但:

将原先第一个Pass(即Z-Prepass)单独分离出来为单独一个Shader,并先使用这个Shader将整个场景的Opaque的物体渲染一遍。

而原本的Shader只剩下原本的第二个Pass,仍然关闭深度写入,并且将深度比较函数设置为相等。

将Z-Prepass单独提出来使用一个RenderFearure

这里补充说明:URP的SRP batch做的合批是不会减少Draw Call的,它的最大的优化在于合并set pass call,减少set pass call的开销,因为CPU上的最大开销来自于准备工作(设置工作),而非DrawCall本身(这只是要放置GPU命令缓冲区的一些字节而已),Draw Call是不会减少的。

(3)Z-Prepass的性能消耗问题 

 有人通过实验测得Z-Prepass带来的消耗要远大于几何变化光栅缩减的消耗

Depth pre pass worth it ? - Graphics and GPU Programming - GameDev.net

实际上,Z-Prepass并不是一个一成不变的决策,而是要根据实际项目情况来自行判断是否采用。比如说有一个场景,有非常多的Overdraw并且没办法很好的将透明物体从前往后进行排序,那么此时Z-Prepass的计算消耗是远小于这些Overdraw的消耗的。

2.Z-Prepass的应用

1.透明渲染的一种解决方案

看不看得到背面根据实际情况选择(个人觉得就算是透明也还是不看到背面比较好)想要看到背面的话,需要先渲染背面剔除正面,再在下一个Pass中渲染正面剔除背面。

2.头发渲染

首先渲染头发都是以面片的方式进行渲染,渲染半透明头发面片需要从后往前渲染排序渲染。普通的渲染方法是先将不透明的部分渲染出来,再渲染半透明部分的背面和正面。这种渲染方式会产生非常多的Overdraw,因此需要用Early-Z进行剔除。但是Early-Z不能启用透明度测试,因此需要使用Z-Prepass。

Pass1:先渲染不透明的部分。开启透明度测试,关闭背面剔除,开启深度写入且深度测试为Less(小于时通过)。

除了关闭背面剔除,其他都是默认的渲染不透明物体方式。

Pass2:渲染半透明片面的背面。开启透明度测试,选择正面剔除,关闭深度写入。

关闭深度写入,背面所在的深度缓冲区可以被覆盖掉。

Pass3:渲染半透明片面的正面。开启透明度测试,选择背面面剔除,开启深度写入。

Pass1:先把结果渲染到Z-Perpass上开启透明度测试,关闭颜色输出,关闭背面剔除,开启深度写入且深度测试为Less,在片元着色器输出透明度值。

Pass2:渲染不透明的部分开启透明度测试,关闭背面剔除,关闭深度写入且深度测试设置为Equal(相等时通过)。

Pass3:渲染半透明片面的背面开启透明度测试,选择正面剔除,关闭深度写入。

关闭深度写入,背面所在的深度缓冲区可以被覆盖掉。

Pass4:渲染半透明片面的正面开启透明度测试,选择背面面剔除,开启深度写入。


参考

3500_Early-z和Z-prepassF_哔哩哔哩_bilibili

3500Early-Z和Z-Prepass(改) (qq.com)

渲染杂谈:early-z、z-culling、hi-z、z-perpass到底是什么?_子胤的博客-CSDN博客

TA入门笔记(十八)_urp zprepass_黑史密斯的博客-CSDN博客

百人计划3.5Early-z与Z-Prepass - 知乎 (zhihu.com)

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

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

相关文章

Vue 自定义事件绑定与解绑

绑定自定义事件 说到 Vue 自定义事件,那就需要搞清楚一个问题,为啥有这个玩意。 说到自定义事件之前,需要理解 组件基础的概念。理解了基础概念之后,我们就知道 Vue 的父子之间的通信, 一是 父组件通过 Prop 向子组件…

CK_Label_V1 CK_Label_V9 CK_Label_V11 System Developer‘s Manual

一、Register PTL You should register the PTL to our Management System first; 1、Register CK_Label_V1 Quickly press the side button three times Register ok:The led will turn off after flashing red light and the buzzer will beep once…

一个3年Android的找工作记录

作者:Petterp 这是我最近 1个月 的找工作记录,希望这些经历对你会有所帮助。 有时机会就像一阵风,如果没有握住,那下一阵风什么时候吹来,往往是个运气问题。 写在开始 先说背景: 自考本,3年经验&#xff0…

【JVM】(二)深入理解Java类加载机制与双亲委派模型

文章目录 前言一、类加载过程1.1 加载(Loading)1.2 验证(Verification)1.3 准备(Preparation)1.4 解析(Resolution)1.5 初始化(Initialization) 二、双亲委派…

在线/开源GNSS处理软件/平台介绍

当前,存在较多的GNSS开源/免费软件,可用于质量检核、RTK解算和PPP解算等,本文总结了部分常用的处理软件,其详细信息如表1和表2所示。 表1 常用GNSS预处理(格式转换、质量检核)软件: 软件名称 …

RunnerGo五种压测模式你会配置吗

我们在做性能测试时需要根据性能需求配置不同的压测模式如:阶梯模式。使用jmeter时我们需要安装插件来配置测试模式,为了方便用户使用,RunnerGo内嵌了压测模式这一选项,今天给大家介绍一下RunnerGo的几种压测模式和怎么根据性能需…

基于各种方式划分 vlan

划分VLAN的方式有:基于接口、基于MAC地址、基于IP子网、基于协议、基于策略(MAC地址、IP地址、接口)。 VLAN(虚拟局域网)可以按照以下几种方式进行划分: 端口划分方式 将交换机端口按照需要划分成不同的…

低碳 Web 实践指南

现状和问题 2023年7月6日,世界迎来有记录以来最热的一天。气候变化是如今人类面临的最大健康威胁。据世界卫生组织预测2030年至2050年期间,气候变化预计每年将造成约25万人死亡。这是人们可以真切感受到的变化,而背后的主要推手是碳排放。 …

软件定时器

Q: 什么是定时器? A: 其实在单片机的学习中,已经接触过无数次定时器了,所谓定时器,简单可以理解为闹钟,到达指定一段时间后,就会响铃。 STM32 芯片自带硬件定时器,精度较高,达到定时…

一年级数学 数一数(一到十)

今天我们来学习数一数 有一些老人 眼睛可能花了 需要我们在动物园数清楚是多少个动物 然后告诉他们 可能有的小朋友 不知道某些数字怎么读 您可以打开地址 https://fanyi.baidu.com/?aldtype16047#zh/en/ 将数字 输入到 输入框内 然后点击 下面的小话筒 系统就会读出来了 小…

Java课题笔记~ MyBatis缓存

为了减少重复查询给数据库带来的压力,MyBatis提供了缓存机制,这种机制能够缓存查询的结果,避免重复的查询。 MyBatis提供了两种缓存方式: 一种为针对于SqlSession的缓存【默认开启】 另一种为针对于全局的缓存【手动开启】 一…

社科院与杜兰大学金融管理硕士为什么值得?来这里一探究竟

金融管理方向是近年来考研的热门专业,越来越多的学生在择校时也会将院校专业作为优先考虑的标准。而社科院与杜兰大学金融管理硕士项目作为热门中的热门,究竟为什么值得读呢?下面我们一起去探个究竟吧 一、中美名校强强联合,顶级师…

解压缩软件WinRAR-bandizip-7z--洛

个人收集的解压软件!后期还会更新 ------------------------------------------------------------------- WinRAR:密码1234WinRARhttps://wwzb.lanzoue.com/b0485ldcj BandiZip:密码1234 Bandizip-Professionalhttps://wwzb.lanzoue.com/…

正交变换和仿射变换

正交变换和仿射变换 平面的正交变换 正交点变换(保距变换) 平面上的一个保持任意两点距离不变的点变换 平面正交变换性质 正交变换的乘积是正交变换恒等变换是正交变换正交变换将(不)共线的三点映射成(不&#xff09…

微服务系列<3>---微服务的调用组件 rpc 远程调用

什么是rpc调用,让我们调用远程方法就像调用本地方法一样 这就属于rpc调用 rpc是针对于本地来说的 调用远程方法根调用本地方法一样 如果能达到这种效果 就是rpc调用如果达到一种效果 调用远程和调用本地一样 他就是一种rpc框架2个微服务 之间发的调用 我们之前通过ribbon的方式…

UG\NX 二次开发 相切面、相邻面的选择控件

文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan 简介: 有群友问“UFUN多选功能过滤面不能选择相切面或相邻面之类的吗?” 这个用Block UI的"面收集器"就可以,ufun函数是不行的。 效果&am…

python 将excel 多行进行分组合并

def exc():"""# 需要用到分组的概念:将角色和业务单据的进行分组,结果合并为一行"""df pd.read_excel(test33.xlsx)# 设置需要分组的字段cols [姓名, 科目]#agg() 其中的参数字段为之后输出的表格中的列字段df df.groupby(cols).agg({姓名: f…

Java三大特征之多态

文章目录 一、多态的概念二、多态实现条件三、重写四、向上转型和向下转型4.1向上转型4.2向下转型 五、多态的优缺点六、避免在构造方法中调用重写的方法 一、多态的概念 多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为&#x…

Error attempting to get column ‘xxx‘ from result set. Cause: java.sql.SQLDataException错误的解决方法

文章目录 1. 复现错误2. 分析错误3. 解决错误4. 文末总结 1. 复现错误 今天写好导入hive表的详情列表的接口,如下代码所示: /*** hive表导入的回调接口** author super先生* datetime 2023/3/20:16:32* return*/ResponseBodyGetMapping(value "/xx…

老师如何制作学生分班查询系统?

在新学期开始之前,学校和教师需要确定学生的分班信息,以便学生在返校前做好准备。在这个过程中,一个功能强大的分班查询系统将非常有用,可以帮助家长和学生快速查看分班情况。制作一个分班查询系统需要仔细规划和设计,…