【TA100】图形 3.5 Early-z和Z-prepass

news2024/11/25 6:57:43

一、深度测试:Depth Test

1.回顾深度测试的内容

  • 深度测试位于渲染管线哪个位置
    ○ 深度测试位于逐片元操作中、模板测试后、透明度混合前
    在这里插入图片描述

为什么做深度测试

● 深度测试可以解决:物体的可见遮挡性问题
○ 我们可以用一个例子说明
在这里插入图片描述
■ 图的解释:
● 首先先渲染紫色三角形,紫色三角形的深度值为5,当渲染它的时候,它与深度缓冲区中的∞做比较,因为默认的test比较条件为LEqual,所以5小于∞,并且写入了深度缓冲器
● 之后进行黄色三角形的渲染,和上一步同理,会进行深度对比并进行相关操作,渲染完成后的结果如右图下边所示

深度测试流程图

● 具体每一步都可以对应之前讲的笔记理解
在这里插入图片描述
深度测试的逻辑/伪代码
在这里插入图片描述

2.深度测试带来的问题

● 前边已经说过很多次了,就是性能浪费、OverDraw

在这里插入图片描述
● 简单地概括就是
○ 在深度测试前计算过的片元,有一些通过不了深度测试将会被直接抛弃(图中的红色片元),那么之前做得计算就都是无效计算了。
● 这个问题的解决方法就是:early-z,先进行取舍,然后进入测试。

二、提前深度测试:early-z

1.Early-Z的内容

● 是在传统管线中的光栅化阶段之后、片元着色器之前加的一步操作。在这里插入图片描述
在这里插入图片描述
○ 图中的例子:
■ 片元1写入深度后,在渲染片元2、3的时候,会进行提前深度测试(z-cull),因为没有通过,所以这两个片元不会被计算
● 区分两次深度测试
■ 提前的深度测试叫作Z-Cull
■ 后续的深度测试为了确定正确的遮挡关系,叫作Z-Check
○ 也就是在计算之前就做一次深度测试,如果不通过就直接不计算了,这样就避免了无效的计算
● 补充:
○ Early-Z同样可以搭配使用模板测试

2.Early-Z失效的情况

● ①开启Alpha Test 或 clip/discard等手动丢弃片元操作
○ 通常Early-Z不仅会进行深度测试,还要进行深度写入
○ 例如以下情况:
■ 如果经过AlphaTest,前面渲染的片元被丢弃了(但写入了深度),那么后续的像素都将无法正常渲染。
● ②手动修改GPU插值得到的深度
○ 类似上述情况
● ③开启Alpha Blend
○ 开启了透明度混合不会开启深度写入,也就不符合Early-Z了
● ④关闭深度测试
○ 都关了还测试啥

3.高效利用Early-Z

  • 不透明物体由远往近渲染,early-z将没有任何优化效果
    ● 在渲染前,将不透明物体从近往远渲染的话,Early-Z能发挥最大的性能优化
    ● 具体怎么排序?
    ○ ->可以让cpu将物体按照由近到远的顺序排好,再交付给gpu进行渲染
    ○ 问题:
    ■ 复杂的场景,cpu性能消耗很大
    ■ 严格按照由近到远的顺序渲染,将不能同时搭配批处理优化手段。
    ● 有没有其他方法? ->pre-z

三、使用 Z-Prepass(Pre-Z)

1.方式1:双pass

  • 内容
    ● 使用两个pass
    ○ pass1:Z-prepass中仅仅写入深度,不计算输出任何颜色。目的只是为了深度值写入缓冲区
    ○ pass2:关闭深度写入,将深度比较函数改为相等,进行正常的透明度混合(AlphaBlend)
    ● 效果:
    ○ 每个物体都会渲染两个pass,且所有物体的z-prepass的结果就自动形成了一个最小深度值的缓冲区Z-buffer,无需cpu进行排序
    ● 代码:
    在这里插入图片描述
    问题1:动态批处理
    ○ 多pass shader无法进行动态批处理 —> Draw Call问题
  • 问题2:Draw Call
    ○ 使用z-prepass shader 的物体,draw call会多一倍

2.方式2:提前分离的Prepass

用于解决DrawCall问题

  • 内容
    ● 仍然使用两个pass
    ○ 将pass1的z-prepass单独分离出一个shader,并用这个shader将场景的不透明物体先渲染一遍
    ○ 原来shader中的pass,仍然关闭深度写入,深度比较函数仍然为相等,进行正常的透明度混合
    -勘误
    ● //摘自评论区:
    ● URP的SRP batch做的合批是不会减少Draw Call的
    ○ 他的最大的优化在于合并set pass call,减少set pass call的开销
    ○ 因为CPU上的最大开销来自于准备工作(设置工作)
    ○ 而非DrawCall本身(这只是要放置GPU命令缓冲区的一些字节而已),draw call是不会减少的

3.Pre-Z也是透明渲染的一种解决方案

在这里插入图片描述
● 这样会存在一个问题:无法看到透明物体的背面
● 解决方法:透明物体的双面渲染
○ 核心思路:将渲染分为正面背面两部分
○ pass1:
■ 只渲染背面(cull front)
○ pass2
■ 只渲染正面(cull back)
○ 由于Unity会顺序执行Subshader中的各个Pass,所以我们可以保证背面总是在正面被渲染之前渲染,来得到正确的深度渲染关系

四、Z-prepass的其他问题
1.Z-prepass的性能消耗是否能被忽视
● 国外论坛一位名为lipsryme的老哥做了一项实验:
在这里插入图片描述
○ 可以看到,Z-prepass的消耗为2.0ms,而带来的优化只减少了0.3ms(2.7-2.4)
○ 后续讨论中,发现Z-prepass是需要根据项目的实际情况来决定是否采用的。
● 总结有以下建议
○ 当一个有非常多OverDraw的场景,且不能很好的将不透明物体从前往后进行排序时,可以考虑使用PreZ进行优化
○ 注意,PreZ会增加DrawCall,如果用错了可能是负优化

五、Early-Z 和 Z-prepass的实例应用

1.面片叠加的头发渲染

● 对于半透明的面片来说,需要从后往前进行排序渲染才能得到正确的透明度混合结果
在这里插入图片描述

2.排序后的头发渲染


● 分为3个pass
○ pass1
■ 处理不透明部分,开启Alpha test透明度测试,仅通过不透明的像素,
■ 关闭背面剔除
■ 开启深度写入
○ pass2
■ 剔除正面,渲染背面
○ pass3
■ 剔除背面,渲染正面
● 问题:会带来非常多OverDraw的问题

3.性能改善

● 使用Early-Z剔除
● 透明度测试开启时Early-Z无法使用的解决方案:
○ 使用一个简单的shader进行透明度测试形成 Z-Buffer,(就是我们上边说的提前分离的z-prepass)

4.改善的渲染方案

● pass1:准备Z-Buffer
○ 开启透明度测试
○ 关闭背面剔除
○ 开启深度写入,深度测试设置为less
○ 关闭颜色缓冲区写入
○ 用于一个简单的片元着色器来返回透明度值
● pass2、pass3、pass4参考之前排序后的头发渲染部分,同理

六、其他参考资料

● https://www.cnblogs.com/ghl_carmack/p/10166291.html —深入剖析GPU Early Z优化

七、总结Early-Z的限制

● 适用情况:
○ Early-Z适用于OverDraw很高的情况
● 会失效的情况:
○ ①开启Alpha Test 或 clip/discard等手动丢弃片元操作
○ ②手动修改GPU插值得到的深度
○ ③开启Alpha Blend
○ ④关闭深度测试
● 如何生效?
○ Early-Z属于硬件优化,如果硬件支持会自动开启

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

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

相关文章

windows应急整理

windows应急整理 Virustotal 网站分析恶意样本 BrowingHistoryView 查看浏览器所有历史记录,可能会请求攻击者的恶意网站或者下载东西 启动项检查 开机启动项文件夹 msconfig 注册表run 键值查看 启动项 临时文件检查,temp 目录权限特殊,容易成为被利用对象 %temp%查看 tem…

华为HCIP第一天---------RSTP

一、介绍 1、以太网交换网络中为了进行链路备份,提高网络可靠性,通常会使用冗余链路,但是这也带来了网络环路的问题。网络环路会引发广播风暴和MAC地址表震荡等问题,导致用户通信质量差,甚至通信中断。为了解决交换网…

C# WebSocketSharp 框架的用法

效果: 一、概述 WebSocketSharp 是一个 C# 实现 websocket 协议客户端和服务端,WebSocketSharp 支持RFC 6455;WebSocket客户端和服务器;消息压缩扩展;安全连接;HTTP身份验证;查询字符串,起始标题和Cookie;通过HTTP代理服务器连接;.NET Framework 3.5或更高版本(包括…

腾讯云服务器云监控是什么?

腾讯云服务器云监控是什么?云监控用于监控云服务器性能资源指标如CPU利用率、内存使用量、内网外网出入带宽、TCP连接数、硬盘IOPS、硬盘IO等性能指标,云服务器吧建议免费开通云监控功能。 什么是云监控? 腾讯云服务器CVM云监控是什么&…

从小白到大神之路之学习运维第43天---第三阶段----LVS-----keepalived+LVS(DR)搭建部署

第三阶段基础 时 间:2023年6月19日 参加人:全班人员 内 容: keepalivedLVS(DR)搭建部署 目录 一、作用 技术特点: 与nginx的区别: 安全性: 配置文件: 二、环境简介 三、操作步骤 …

SPEC 2006 gcc version 8.3.0 (Uos 8.3.0.3-3+rebuild) x86_64 源码编译tools 错误处理笔记

编译tools 拷贝tools到安装目录 cp /mnt/iso/tools /opt/speccpu2006/ -r 执行编译 su rootcd /opt/speccpu2006/tools/src sh -x buildtools 错误 undefined reference to __alloca 编辑./make-3.82/glob/glob.c,注释掉以下宏判断 you should not run config…

unittest教程__测试报告(6)

用例执行完成后,执行结果默认是输出在屏幕上,其实我们可以把结果输出到一个文件中,形成测试报告。 unittest自带的测试报告是文本形式的,如下代码: import unittestif __name__ __main__:# 识别指定目录下所有以tes…

springcloud 中RestTemplate 是怎么和 ribbon整合,实现负载均衡的?源码分析

一、RestTemplate 拦截器了解 RestTemplate 内置了一个 ClientHttpRequestInterceptor,这个是一个拦截器操作,我们可以在请求的前后做一些事情。然后我们看一下这个类,这个类里面 有一个 intercept方法。我们看下这个实现类,里面有一个 LoadBalancerInterceptor实现类。 …

pm2详解

对于后台进程的管理,常用的工具是crontab,可用于两种场景:定时任务和常驻脚本。关于常驻脚本,今天介绍一款更好用的工具:pm2,基于nodejs开发的进程管理器,适用于后台常驻脚本管理,同…

whisper语音识别部署及WER评价

1.whisper部署 详细过程可以参照:🏠 创建项目文件夹 mkdir whisper cd whisper conda创建虚拟环境 conda create -n py310 python3.10 -c conda-forge -y 安装pytorch pip install --pre torch torchvision torchaudio --extra-index-url 下载whisper p…

STM32单片机LED显示屏驱动原理与实现

STM32单片机驱动LED显示屏的原理与实现方法与Arduino类似,但涉及到的具体硬件资源和库函数可能会有所不同。下面是一个详细的介绍: 原理: STM32单片机驱动LED显示屏的原理是通过控制GPIO引脚的电平状态来控制LED的亮灭。通过设置引脚的输出电…

Jetpack Compose中的附带效应及效应处理器

Jetpack Compose中的附带效应及效应处理器 将在任何可组合函数范围之外运行的代码称为附带效应。 为什么要编写在任何可组合函数范围之外的代码? 这是因为可组合项的生命周期和属性(例如不可预测的重组)会执行可组合项的重组。 让我们通过一…

软考高级系统架构设计师(一) 考什么

目录 一、背景 二、软考(高级)的用途 三、考什么 第一科:综合知识 第二科:案例分析 第三科:论文 四、系统架构设计师常见的考试内容 五、模拟与训练 一、背景 系统架构设计师,属于软考高级考试中的一种。 二、软考(高级)…

Node搭建前端服务Mysql数据库交互一篇搞定

目录 介绍 安装环境及数据准备 代码示例 mysql连接工具类 测试方法文件 单表总量查询 单表条件查询 新增数据 修改 删除 ​编辑 ​编辑 联表查询 联表过滤 搭配express服务搭建api使用 介绍 在前端开发中,可以使用纯node前端进行服务搭建与mysql进行数据库的交互,这样…

Bun vs. Node.js

Bun vs. Node.js 你知道 Bun 吗?Bun 是新的 JavaScript 运行时,最近在技术领域引起轰动,它声称比 Node.js 更好。本文将展示如何使用基准分数对其进行测试。 在本文中,我们将介绍最近在技术领域引起轰动的新的 Bun 运行时。我们…

螯合剂试剂:DOTA-CH2-Ph-azide(HCl salt),分子式:C21H34Cl3N7O6,的相关参数信息

文章关键词:双功能螯合剂,azide叠氮 为大家介绍(CAS:N/A),试剂仅用于科学研究,不可用于人类,非药用,非食用。 分子式:C21H34Cl3N7O6 分子量:586.9 英文名称&a…

限定国家及时间|心理学老师如期赴意大利访学

S老师由于个人情况变化需要办理CSC改派,并限定了国家且要求年底出国。我们最终用意大利巴里大学的邀请函,助其成功申请了CSC改派并如期出国。 S老师背景: 申请类型: CSC访问学者 工作背景: 高校教师 教育背景&#…

Python基础知识进阶之数据爬虫

一、爬虫概述 爬虫是指利用网络抓取模块对某个网站或者某个应用中有价值的信息进行提取。还可以模拟用户在浏览器或者APP应用上的操作行为,实现程序自动化。简单来说就是我们把互联网有价值的信息都比喻成大的蜘蛛网,而各个节点就是存放的数据&#xff0…

如何写出让业务满意的性能测试报告

目录 前言 需求背景 测试报告的作用是什么? 业务团队更关注哪些内容? 输出让业务满意的性能测试报告 总结 前言 写出一份让业务满意的性能测试报告,需要充分理解和呈现测试结果,结合业务需求进行分析和解读。 这篇文章&am…

别再错过重要任务,手机日程提醒软件用哪个

你有没有过这样的经历,因为平时生活、工作中太过于忙碌,而错过重要任务的完成?相信很多人都会忘记过重要的事情,例如平时工作太忙了,而忘记了之前安排好的会议。那么在待办事项越来越多的今天,我们如何保证…