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

其实这篇我是不想写的,因为网上资料真的非常非常多很多人都写过,但是我后来想了想,做笔记不就是这样吗,所以就写吧~。前置知识:深度测试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)

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

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

相关文章

小主机折腾记16

7月折腾了 1.2500s,2550k,e3 1225的性能测试 结果如下图 总结如下: a.2500s e3 1225 2390t 差别不大 b.1333频率相对1066频率内存提升12%左右 c.为什么少了2550k,因为装上去风扇尬转,没画面,我猜是因为…

2023年第四届“华数杯”数学建模思路 - 复盘:光照强度计算的优化模型

文章目录 0 赛题思路1 问题要求2 假设约定3 符号约定4 建立模型5 模型求解6 实现代码 0 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 1 问题要求 现在已知一个教室长为15米,宽为12米&#xff0…

百度地图点标记加调用

先看效果 PHP代码 <?phpnamespace kds_addons\edata\controller;use think\addons\Controller; use think\Db;class Maps extends Controller {// 经纬度计算面积function calculate_area($points){$totalArea 0;$numPoints count($points);if ($numPoints > 2) {f…

第六章:SpringMVC上

第六章&#xff1a;SpringMVC上 6.1&#xff1a;SpringMVC简介 什么是MVC MVC是一种软件架构的思想&#xff0c;将软件按照模型、视图、控制器来划分。 M&#xff1a;Model&#xff0c;模型层&#xff0c;指工程中的JavaBean&#xff0c;作用是处理数据。 一类称为实体类Bean&…

JavaEE初阶之网络初识

一、网络发展史 1.1独立模式 独立模式:计算机之间相互独立; 1.2网络互连 随着时代的发展,越来越需要计算机之间互相通信,共享软件和数据,即以多个计算机协同工作来完成业务,就有了网络互连。网络互连:将多台计算机连接在一起,完成数据共享。 数据共享本质是网络数据…

时序预测 | Python实现NARX-DNN空气质量预测

时序预测 | Python实现NARX-DNN空气质量预测 目录 时序预测 | Python实现NARX-DNN空气质量预测效果一览基本介绍研究内容程序设计参考资料效果一览 基本介绍 时序预测 | Python实现NARX-DNN空气质量预测 研究内容 Python实现NARX-DNN空气质量预测,使用深度神经网络对比利时空气…

Hive数据仓库

数据仓库概念与起源发展由来 数仓概念 数据仓库&#xff08;英语&#xff1a;Data Warehouse&#xff0c;简称数仓、DW&#xff09;&#xff0c;是一个用于存储、分析、报告的数据系统。数据仓库的目的是构建面相分析的集成化数据环境&#xff0c;分析结果为企业提供决策支持…

使用docker部署一个jar项目

简介: 通过docker镜像, docker可以在服务器上运行包含项目所需运行环境的docker容器, 在线仓库里有很多各个软件公司官方发布的镜像, 或者第三方的镜像. 如果我们需要使用docker把我们的应用程序打包成镜像, 别的机器上只要安装了docker, 就可以直接运行镜像, 而不需要再安装应…

LabVIEW使用灰度和边缘检测进行视频滤波

LabVIEW使用灰度和边缘检测进行视频滤波 数字图像处理&#xff08;DIP&#xff09;是真实和连续世界的离散表示。除此之外&#xff0c;这种数字图像在通信、医学、遥感、地震学、工业自动化、机器人、航空航天和教育等领域变得非常重要。计算机技术越来越需要视频图像的数字图…

软件测试这个行业究竟能做到多少岁?35岁真的是一个坎?

前言 在国内&#xff0c;软件测试行业是近10多年来随着互联网的飞速发展逐步兴起来的。 随着行业的发展&#xff0c;测试市场的人才缺口也越来越大&#xff0c;能够提供的就业机会也就越来越多&#xff0c;所以很多人都意气风发地投身到测试行业之中&#xff0c;憧憬这自己在这…

数据结构 | 递归

目录 一、何谓递归 1.1 计算一列数之和 1.2 递归三原则 1.3 将整数转换成任意进制的字符串 二、栈帧&#xff1a;实现递归 三、递归可视化 四、谢尔平斯基三角形 五、复杂的递归问题 六、动态规划 一、何谓递归 递归是解决问题的一种办法&#xff0c;它将问题不断地分…

css滚动条样式指南

css滚动条样式指南 滚动条是网页设计中经常被忽视的元素。虽然它看起来像是一个小细节&#xff0c;但它在网站导航中起着至关重要的作用。默认的滚动条可能看起来不合适&#xff0c;有损整体美观。本文将介绍如何使用 CSS 自定义滚动条。 在 Chrome、Edge 和 Safari 中设置滚…

机器学习笔记之优化算法(六)线搜索方法(步长角度;非精确搜索;Glodstein Condition)

机器学习笔记之优化算法——线搜索方法[步长角度&#xff0c;非精确搜索&#xff0c;Glodstein Condition] 引言回顾&#xff1a; Armijo Condition \text{Armijo Condition} Armijo Condition关于 Armijo Condition \text{Armijo Condition} Armijo Condition的弊端 Glodstein…

【限时优惠】红帽openstack管理课程(CL210) 即将开课

课程介绍 通过实验室操作练习&#xff0c;学员将能够深入学习红帽企业 Linux OpenStack 平台各服务的手动安装方法&#xff0c;还将了解 OpenStack 开发社区的未来发展计划。 培训地点&#xff1a; 线下面授&#xff1a;苏州市姑苏区干将东路666号401室&#xff1b; 远程…

Arcgis地图实战一:单个图层中设施的隐藏及显示

文章目录 1.效果图预览2.弹框的实现3.显示及隐藏的实现 1.效果图预览 2.弹框的实现 let alert this.alertCtrl.create();alert.setTitle(请选择设施);for (let item of this.ctralllayers) {alert.addInput({type: checkbox,label: item.name,value: item.id,checked: item.vi…

二、数据结构10:堆 模板题+算法模板(堆排序,模拟堆)

文章目录 算法模板堆题目代码模板堆的原理down操作理解&#xff1a;up操作理解建堆操作关于heap_swap中存的映射数组理解&#xff08;模拟堆题目中用到&#xff09; 模板题堆排序原题链接题目思路题解 模拟堆原题链接题目思路题解 算法模板 堆题目代码模板 // h[N]存储堆中的…

2023年FPGA好就业吗?

FPGA岗位有哪些&#xff1f; 从芯片设计流程来看&#xff0c;FPGA岗位可以分四类 产品开发期&#xff1a;FPGA系统架构师 芯片设计期&#xff1a;数字IC设计工程师、FPGA开发工程师 芯片流片期&#xff1a;FPGA验证工程师 产品维护期&#xff1a;FAE工程师 从行业上来说&#x…

前端学习——Vue (Day9)

Pinia 快速入门 https://pinia.vuejs.org/zh/getting-started.html npm install pinia import { createApp } from vue import { createPinia } from pinia import App from ./App.vueconst pinia createPinia() const app createApp(App)app.use(pinia) app.mount(#app)&l…

Array.prototype.slice.call()方法详解

slice:用来截取截取字符串方法Array: javascript的一个引用类型&#xff0c;其原型prototype上有一个方法叫slicecall和apply &#xff1a; 用来改变对象中函数内部的this引用&#xff0c;使得函数可以随便换‘妈妈’ 为什么不直接用 arguments.slice(1)呢 不是一样的么? 答案…

消息中间件应用场景介绍

提高系统性能首先考虑的是数据库的优化&#xff0c;但是数据库因为历史原因&#xff0c;横向扩展是一件非常复杂的工程&#xff0c;所有我们一般会尽量把流量都挡在数据库之前。 不管是无限的横向扩展服务器&#xff0c;还是纵向阻隔到达数据库的流量&#xff0c;都是这个思路。…