渲染杂谈:early-z、z-culling、hi-z、z-perpass到底是什么?

渲染杂谈:early-z、z-culling、hi-z、z-perpass到底是什么?

之前一直被这几个和深度缓存(z-buffer)相关的概念搞得神魂颠倒。今天在翻阅《Real-Time Rendering》时碰巧碰巧看到了这部分的讲解。硬着头皮看了看,姑且算是讲几个概念分清楚了。以我的记性估计下周就全忘了,所以打算顺手记下来。

这四种技术本质上都是解决传统渲染管线中的同一个问题——过度绘制(OverDraw) 。一个经典的渲染管线通常会依次经历顶点阶段光栅化片元阶段逐像素处理。其中片元阶段会进行复杂的光照计算,是整个管线的性能瓶颈。而在逐像素阶段会对计算出来的片元值进行各种测试以判断这个片元会不会最终显示到屏幕上。这就带来了一个矛盾:明明我在片元阶段花费了最大的力气计算出结果,但马上的逐像素阶段就可能将这个结果直接舍弃。而事实上逐像素阶段的深度测试(z-test)会舍弃大量片元,对于较为复杂的场景甚至会丢弃80%之多。如果我们能在片元阶段之前进行深度测试提前丢弃掉那些不需要绘制到屏幕上的片元,那么就可以减少大量片元计算提升效率。early-z、z-cull、hi-z、z-perpass都是为了解决这个问题而产生的不同技术。

1.early-z

early-z的解决方式非常简单,就是直接修改传统渲染管线,在光栅化和片元阶段中间,加入一个early-z阶段。这个阶段进行的操作和原本逐像素处理阶段的z-test(为了与early-z区别,这个阶段也会被成为late-z)操作完全一样,现代的gpu已经都开始包含这样的硬件设计。但是early-z有以下两个主要的缺点:

* 一旦进行了手动写入深度值、开启alpha test或者丢弃像素等操作,那么gpu就会关闭early-z直到下次clear z-buffer后才会重新开启(不过现在的gpu也在逐渐优化,使其更智能开关early-z)。之所以gpu会选择关闭early-z是因为上述那些操作可能会在片元阶段与late-z阶段之间修改深度缓存中的深度值,导致提前的early-z的结果并不正确。我们也可以在fragment shader中使用layout(early_fragment_tests)来强制打开early-z。

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

 

2.z-culling

z-culling和early-z一样都是gpu硬件层面的优化,所以之前我一直混淆两者是同一种东西。两者最明显的区别是early-z是以pixel quad为单位(既以4个像素为一组,因为深度缓存内的数据是按Z字形排列的)逐个像素进行比较,而z-culling是以tile(比如16*16像素)为单位进行整体比较。这里又涉及到tile的概念,虽然我看到的资料中并没有提到,但是我认为这里的tile和tile based rendering(TBR)中的tile是同一概念。也就是说这种技术应该只应用于使用TBR架构的移动端gpu中。其主要方式取得当前tile所对应的的深度缓冲区中的Zmax和Zmin,如果该tile当前深度的最小值<Zmax,则说明整个tile都不可见将整个tile全部丢弃。如果该tile当前深度的最大值>Znim,则说明整个tile都处于最前面,保留整个tile,并因此可以省去该tile对应片元在late-z阶段对深度缓冲区的读取操作,直接写入就可以。对于其它情况,则交给后续的深度处理进行更细致的判断。由于z-culling通常用于TBR架构gpu,所以它也和TPR架构一样保持了对gpu带宽的敏感性。因此不同于early-z,z-culling并不会对深度缓存进行写入,也不会对深度缓存进行直接读取。它所需要的比对数据(Zmax和Zmin)都会储存在on-chip缓存中的某个固定区域,特点即是容量小但速度快。由于z-culling对深度缓存是只读的,因此不会因为手动写入深度值、开启alpha test或者丢弃像素等操作对其有影响,这刚好解决了early-z的第一个缺点。总结来说,z-culling利用TBR架构进行了非常粗粒度的提前深度测试,但不会带来额外的对于深度缓存进行读写消耗,因此也比z-early具有刚多的适用范围。

这里有一个疑问,为什么early-z不像z-culling一样,对深度缓存只读,来避免收到手动写入深度值、开启alpha test或者丢弃像素等操作的影响?其中一个解释是,在z-culling阶段后,那些没有被优化的片元在late-z阶段会读取深度缓存进行细粒度的测试,完成后再更新写入新的深度缓存。同时也会更新z-culling会访问的on-chip缓存。由于z-culling访问的是on-chip的所以不会带来额外开销,所以整体上只有对深度缓存进行一次读一次写。而对于early-z来说,如果在early-z阶段只读取深度缓存而不写入的话,那么在late-z阶段就需要重新读取然后写入,以更新深度缓存。这就相当于两次读一次写,带来了额外的开销。不过也看到有人说late-z阶段对深度缓存的读写是无论如何都会进行的,所以此处存疑。

还需要说明的是,z-culling和early-z都可以不依赖于对方单独存在,当然两者也可以共存。当两者共存的时候,会先进行z-culling做粗粒度的筛选,再进行early-z做细粒度的排除。在有些资料中也会把z-culling成为HiZ(没错,就是最后要讲的hi-z),这要是不弄混就怪了。

 

3.z-perpass

和上面两种技术不同,z-perpass是一种软件技术。它主要是配合early-z使用,来减少开始提到的early的第二个缺点——效果不稳定。其做法是将场景做两个pass的绘制。第一个pass仅写入深度,不做任何复杂的片元计算,不输出任何颜色。第二个pass关闭深度写入,并将深度比较函数设为“相等”。我在开篇有提到过度绘制的主要矛盾——经过大量运算的片元,很大概率会在之后被丢弃掉。那么对于第一个pass由于只写入深度,不在片元做任何计算,所以即便之后会被丢弃,也并不可惜。也就是说无论场景中的物体以怎样的顺序绘制,我们都可以以很小的代价提前绘制好当前场景的深度缓存。那么在第二个pass时,early-z就可以用这个深度缓存中的值和当前深度值进行比较,只绘制深度相等的片元,任何其他的片元都可以直接丢弃,因此第二个pass要把深度比较函数设为“相等”。同时当前的深度缓存已经是完全正确的结果了,因此第二个pass也不需要对深度缓存做任何更新,便可以关闭深度写入。

z-perpass必须配合early-z才能发挥效果,如果没有early-z的话,第二个pass的深度测试依旧在片元后,因此所有片元都会在片元阶段进行复杂计算。z-perpass的思想和延迟渲染管线(defered render pipeline,下面也会提到)有些相似,差别在于:第一,z-perpass的第一个pass只计算深度,并且结果直接存储在深度缓存。而延迟渲染会同时计算更多其他的屏幕空间数据,并将这些数据存储在额外的framebuffer中,需要更大的缓存(也就是GBuffer)。第二,z-perpass的第二个pass依旧需要对全场景的各个物体进行绘制(至少顶点阶段是如此),而延迟渲染的第二个pass类似于后处理本质上只绘制了一个屏幕大小的矩形。

4.hi-z

hi-z全名Hierarchical Z,和z-perpass一样也是一种软件技术,据说这项技术最早是在《刺客信条:大革命》中使用的。其核心原理是利用上一帧的深度图和摄像机矩阵,来对当前帧的场景做剔除,对于剔除后的物体进行绘制新的深度图和GBuffer,然后再用新的深度图和当前摄像机矩阵再对当前帧的场景做剔除,对剔除后的物体进行绘制更新刚刚的深度图和GBuffer。之所这种看起来十分复杂的方法能提高效率,是因为每一帧的绘制都已上一帧的绘制结果为基础。我们假设相邻两针差距不会特别大,那么以上一帧的深度图作为结果来对当前帧可见的物体进行筛选,可以得到绝大部分。而对于少量两针不一样的物体,进行第二次深度绘制,由于第二次绘制的少量不一样的物体所带来的的计算量很小,因此可以带来性能上的提升。这种基于前一帧的迭代式的对场景物体进行剔除,便可以在一定程度上减少过度绘制。不过由于我也没有实现过这种算法,所以对这种算法实际带来的效果存疑。

值得注意的是,这里提到了Gbuffer,那么说明hi-z技术是基于延迟渲染管线。而延迟渲染管线本身也是在减少各种由其他原因(包括但不限于深度测试这个原因)导致的过渡绘制。其目的就是希望无论拥有多少模型多少光源,整个场景渲染的复杂度都O(1)。延迟渲染管线本身也是个庞大的话题,可能以后会结合Unity刚刚正式更新的Scriptable Render Pipeline也写点东西。

 

终于把这四种技术讲完了,除了这四种在名字容易让人混淆的技术外,其实还有一些东西没有提到。对于TBR(或者TBDR)架构的gpu,因为其提供了提前优化的潜能所以各家硬件厂商也会有自己独特的针对于过度绘制的优化,比如PowerVR的HSR(Hidden Surface Removal)和Arm的APK(Forward Pixel Kill)。这些技术可以配合early-z等技术来更高效的避免过度绘制。

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

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

相关文章

output怎么用_性能领先,即训即用,快速部署,飞桨首次揭秘服务器端推理库

允中 发自 凹非寺量子位 编辑 | 公众号 QbitAI假如问在深度学习实践中&#xff0c;最难的部分是什么&#xff1f;猜测80%的开发者都会说&#xff1a;“当然是调参啊。”为什么难呢&#xff1f;因为调参就像厨师根据食材找到了料理配方&#xff0c;药剂师根据药材找到了药方&…

GPU架构杂乱备忘——IMR、TBR、TBDR

原文&#xff1a;https://juejin.cn/post/6844904132864655367 GPU架构杂乱备忘——IMR、TBR、TBDR 之前觉得涉及到gpu架构相关的问题只需要知道个大概就好&#xff0c;毕竟在图形api的层面上应该把硬件的细节给隐蔽掉&#xff0c;gpu的架构千千万万&#xff0c;每家厂商每个…

如何用python制作九九乘法表_Python一行代码给儿子制作九九乘法表

一行代码实现九九乘法表 print(\n.join( .join([%sX%s%s%(j,i,i*j) for j in range(1,i1)]) for i in range(1,10))) 1X11 1X22 2X24 1X33 2X36 3X39 1X44 2X48 3X412 4X416 1X55 2X510 3X515 4X520 5X525 1X66 2X612 3X618 4X624 5X630 6X636 1X77 2X714 3X721 4X728 5X735 6X…

帧同步相关文章

https://zentia.github.io/2019/04/22/frame-sync/ http://www.skywind.me/blog/archives/131 https://blog.codingnow.com/2018/08/lockstep.html

动词变名词的变化规则_动词过去式变化规则 - 点评英语网

动词考查是英语学习的重点和难点&#xff0c;动词过去式和过去分词的变化是学生学习的“拦路虎“之一。为了避免枯燥的去记忆&#xff0c;我们可以用一些轻松有趣的口诀去记住动词过去式的变化形式。动词过去式的变化口诀过去式很简单&#xff0c;只要你能这样记。前提必须是动…

requests下载大文件_11种方法教你用Python高效下载资源!

在本教程中&#xff0c;你将学习如何使用不同的Python模块从web下载文件。此外&#xff0c;你将下载常规文件、web页面、Amazon S3和其他资源。最后&#xff0c;你将学习如何克服可能遇到的各种挑战&#xff0c;例如下载重定向的文件、下载大型文件、完成一个多线程下载以及其他…

android自定义push通知_20个海外Web和App推送通知服务工具

在App和网站中使用推送通知有不同的原因&#xff0c;并且在提高流量和与客户互动方面有很多好处。推送通知是一种交互式可点击消息&#xff0c;可将访问者直接引导至你的网站。它们可以帮助你以指数方式增加流量和参与率。因此&#xff0c;营销人员&#xff0c;广告商&#xff…

linux 删除文件_Linux删除文件夹命令有哪些

今天要和大家分享的Linux常用命令是Linux删除文件夹命令,Linux删除文件夹很简单,常用的命令有rmdir和rm,以下分别介绍一下,大家根据情况选择使用即可。 Linux删除文件夹命令有哪些 ①Linux删除文件夹命令:rmdir rmdir命令使用场景: 当有空目录要删除时,可使用rmdir指令。…

url上接收到 el表达式 不渲染_一文摸透从输入URL到页面渲染的过程

一文摸透从输入URL到页面渲染的过程从输入URL到页面渲染需要Chrome浏览器的多个进程配合&#xff0c;所以我们先来谈谈现阶段Chrome浏览器的多进程架构。一、Chrome架构目前Chrome采用的是多进程的架构模式&#xff0c;可分为主要的五类进程&#xff0c;分别是&#xff1a;浏览…

模拟弱网工具的使用

https://zhuanlan.zhihu.com/p/98185153 https://www.jianshu.com/p/5e35a3585df5 今年5G技术开始铺开并进入商用。随着5G的到来&#xff0c;不知道大家有没有和我一样的感受&#xff0c;希望是我心理作用吧&#xff0c;我发现作为一个4G用户&#xff0c;最近我的手机网速是不…

c语言计算a+aa+aaa_物业服务企业信用等级公布,42家获AAA级!你家小区物业怎么样?...

杭州住保房管 根据《浙江省物业服务企业信用信息管理办法》和《浙江省行业信用监管责任体系构建工作方案》&#xff0c;日前&#xff0c;省建设厅公布了 2020年度浙江省物业服务企业信用等级结果名单&#xff0c;杭州165家物业服务企业上榜&#xff0c;绿城物业服务集团有限公司…

python 可视化_python可视化基础

常用的python可视化工具包是matplotlib&#xff0c;seaborn是在matplotlib基础上做的进一步封装。入坑python可视化&#xff0c;对有些人来说如同望山跑死马&#xff0c;心气上早输了一节。其实学习一门新知识&#xff0c;首先要掌握的是这门知识的最少最核心知识&#xff0c;剩…

ios did receive memory warning

今天测试IOS包体时&#xff0c;在一个很老的Ipad上闪退&#xff0c;查log显示是did receive memory warning。 Google了一圈&#xff0c;原因是2013年之前的ipad&#xff0c;用的A7处理器&#xff0c;不支持Unity的ASTC的Texture格式&#xff0c;因此游戏启动后&#xff0c;内…

使用post访问不到接口_Postman工具使用说明

一、工具说明接口测试工具&#xff0c;支持post&#xff0c;get&#xff0c;请求的接口测试&#xff1b;支持参数中带token&#xff0c;带cookie等接口测试。印度阿三开发的产品&#xff0c;稳定性较好&#xff0c;强烈推荐&#xff0c;屡试很爽。适用&#xff1a;前后端分离的…

java正则表达式判断手机号_正则表达式学习之简单手机号和邮箱练习

正则表达式的组成规则在java中&#xff0c;正则表达式的编译是类java.util.regex.Pattern正则表达式的构造摘要1.字符x包括所有大写和小写字母、所有数字、所有标点符号和一些其他符号的普通字符。比如之前的例子可以将[1-9][0-9]{4,12}改成1[0-9]{4,12}或者a[0-9]{4,12}此时就…

unity 解决引入dlopen api的问题

打包出来的ipa在腾讯的wetest的ios预审中报以下错误。 对于dlopen api, 是苹果禁用的&#xff0c;对Unity项目痛苦的挨个二分排查后&#xff0c;发现很多都有可能引入。 1.和XML或Excel相关的C# API极有可能引入。https://blog.csdn.net/qq_36622009/article/details/10388285…

python商品评论分析_NLP实战:用主题建模分析网购评论(附Python代码)

现在电商行业势头正好&#xff0c;对在线零售商来说&#xff0c;他们不受库存或空间的限制&#xff0c;而实体店则必须在有限的空间中存储产品。 但是&#xff0c;在线购物也有它的局限之处&#xff0c;最大的难题之一就是检验产品的真伪。它的质量是否如宣传所说的那么好&…

运营体系_用户运营系统论:解构复杂产品的大规模用户运营体系

本文介绍了大规模用户运营体系中的三大原则——数据驱动、精细化运营、自动化(或叫产品化)&#xff0c;以及用户运营体系中的三个子系统——用户生命周期管理系统、用户分层运营系统、用户行为激励系统。我们在实际的产品工作中&#xff0c;经常会用到各种各样的运营体系&#…

ShaderToy效果学习(转成Unity URP) - MathEye

来自IQ大神的小教程&#xff0c;效果图&#xff1a; shaderToy源码&#xff1a;https://www.shadertoy.com/view/lsfGRr 教程视频&#xff1a;https://www.bilibili.com/video/BV1KK4y1K7wM/ Unity项目代码Git地址&#xff1a;https://github.com/Dejavu0709/Graphics.git Sh…

asp 退出登录修改cookie能进入后台_深入浅出让你理解跨域与SSO单点登录原理与技术...

一&#xff1a;SSO体系结构SSOSSO英文全称Single Sign On&#xff0c;单点登录。SSO是在多个应用系统中&#xff0c;用户只需要登录一次就可以访问所有相互信任的应用系统。它包括可以将这次主要的登录映射到其他应用中用于同一个用户的登录的机制。它是目前比较流行的企业业务…