最近在看基于GPU的遮挡裁剪相关的技术,它本身也是GPU-Driven Rendering Pipleline的其中一环。这项技术充分利用compute shader并行计算的威力,在加速遮挡查询的效率的同时,可以降低查询的延迟。很多文章和paper中都在使用一项称为Hierarchical Z-buffer的技术来作为遮挡查询的重要环节。那么什么是Hierarchical Z-buffer呢?利用它的优势又是什么呢?今天就简单解释一下HiZ-buffer的基本原理,在实际的使用过程中,虽然不同游戏使用了不同的优化手段,但是核心的原理都是一样的。
 
我们假设如下图所示的场景,该图是横切面图,相机是从Z0看向Z1。下面我们就通过该例子来看下,如何使用Hierarchical Z-Buffer来将绿色的物体判定为被遮挡 ,从而将其裁剪掉。

上图中z = 0是近裁剪面,z = 1是远裁剪面。首先我们将遮挡物(红色和蓝色)进行光栅化,得到一个z-buffer,如下图竖着的那根灰色的线就代表了光栅化后的深度值。

接下来就是最重要的一步,下采样z-buffer,得到一串mipmap层级贴图(该mipmap层级图就称为Hierarchical Z-buffer,或者abbreviated HiZ-buffer)
在下采样的过程中,使用的max操作,也就是说两个相邻的像素合下采样为一个像素时,使用的两者中最大的那个的值。如下图所示:

由上图可以看出,每一次下采样,都是对上一层级的保守估计,到了第4级就只剩下一个深度值了。由于下采样的时候用的是max操作,所以如果一个物体在level 2中深度值判定为被遮挡,那么它肯定在level 1中也是被遮挡的。
 
得到HiZ-buffer之后,我们就可以基于它来进行遮挡裁剪了:
计算得到绿色物体的AABB包围盒,该包围盒的x-max/min和y-max/min用来决定采样哪一层级的HiZ-buffer(也就是看哪一层级的尺寸能够涵盖包围盒的所有像素),在本例中该AABB包围盒符合level 2,所以我们选择采样level2,从而得到一个z-buffer的保守估计。接下来我们比较aabb.zmin跟我们采样到的深度值,得知aabb.zmin < z-buffer.sample,所以绿色物体是被遮挡的,应该被裁剪掉。

以上的方法就是基于Hierarchical Z-buffer的遮挡裁剪。可以看出如果没有HiZ-buffer,我们将不得不采样四个样本才能确定一个物体是否被遮挡了,HiZ-buffer大大减少了纹理采样的次数,提高了遮挡查询的效率。

浅谈HiZ-buffer的更多相关文章

  1. 浅谈Base64编码

    浅谈Base64编码 我打赌当你见到Base64这个词的时候你会觉得在哪里见过,因为在你能够上网看到这篇文章的时候你已经在后台使用它了.如果您对二进制数有所了解,你就可以开始读它了. 打开一封Emai ...

  2. 浅谈OCR之Onenote 2010

    原文:浅谈OCR之Onenote 2010 上一次我们讨论了Tesseract OCR引擎的用法,作为一款老牌的OCR引擎,目前已经开源,最新版本3.0中更是加入了中文OCR功能,再加上Google的 ...

  3. 浅谈SQL Server 对于内存的管理

    简介 理解SQL Server对于内存的管理是对于SQL Server问题处理和性能调优的基本,本篇文章讲述SQL Server对于内存管理的内存原理. 二级存储(secondary storage) ...

  4. pb传输优化浅谈

    在正式切入今天要谈的优化之前,先碎碎念一些自己过去这几年的经历.很久没有登录过博客园了,今天也是偶然兴起打开上来看一下,翻看了下自己的随笔,最后一篇原创文章发布时间是2015年的4月,今天是2017年 ...

  5. 浅谈mysql innodb缓存策略

    浅谈mysql innodb缓存策略: The InnoDB Buffer Pool Innodb 持有一个存储区域叫做buffer pool是为了在内存中缓存数据和索引,知道innodb buffe ...

  6. 【ASP.NET MVC系列】浅谈ASP.NET MVC八大类扩展(上篇)

    lASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操 ...

  7. 浅谈Java中的final关键字

    浅谈Java中的final关键字 谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来 ...

  8. []转帖] 浅谈Linux下的五种I/O模型

    浅谈Linux下的五种I/O模型 https://www.cnblogs.com/chy2055/p/5220793.html  一.关于I/O模型的引出 我们都知道,为了OS的安全性等的考虑,进程是 ...

  9. (转)浅谈SQL Server 对于内存的管理

    简介 理解SQL Server对于内存的管理是对于SQL Server问题处理和性能调优的基本,本篇文章讲述SQL Server对于内存管理的内存原理. 二级存储(secondary storage) ...

  10. 浅谈数据库系统中的cache(转)

    http://www.cnblogs.com/benshan/archive/2013/05/26/3099719.html 浅谈数据库系统中的cache(转)   Cache和Buffer是两个不同 ...

随机推荐

  1. C#编写一个较完整的记事本程序

    开发环境 Visual Studio 2019 至少需安装 .NET桌面开发 创建项目并配置 创建窗体文件 配置项目名称及框架 设计界面 创建窗体文件,将控件摆放位置如下,参考系统自带的记事本程序 窗 ...

  2. opencv中namedWindow( )函数

    转自:https://blog.csdn.net/fanjiule/article/details/81606596 第一步,功能说明:namedWindow()的功能就是新建一个显示窗口.可以指定窗 ...

  3. 怎么快速从产品助理/初级 PM 成长为高级 PM?

    一般想成为一枚产品经理的同学,如果没有经过系统的学习,都是从产品专员/助理开始做起的~ 那要想快速从产品助理/初级 PM 成长为高级 PM,以下这几点必不可少 直接上干货~ 全文篇幅较长,可以点赞收藏 ...

  4. SDN实验 3: Mininet 实验——测量路径的损耗率

    验 3:Mininet 实验--测量路径的损耗率 一.实验目的 在实验 2 的基础上进一步熟悉 Mininet 自定义拓扑脚本,以及与损耗率相关的设定:初步了解 Mininet 安装时自带的 POX ...

  5. 多测师讲解自动化测试 _RF关键字001_( 中)_高级讲师肖sir

    1.关键字如下 1.1Get Text 1.2Get Value 2.#上下滑动(滚动条) Open Browser http://www.jd.com gc Maximize Browser Win ...

  6. CS61A Homework: Church Numerals

    Church Numerals Nagging 南大的 SICP 实际上是 Berkeley CS61A 的 clone ,所以我有幸做到了这个 Homework02. 此外要感谢选课系统,让我一个工 ...

  7. python程序整理(2)

    # 写一个函数完成三次登陆功能: # 用户的用户名密码从一个文件register中取出. # register文件包含多个用户名,密码,用户名密码通过|隔开,每个人的用户名密码占用文件中一行. # 完 ...

  8. C语言/C++编程学习:送给考计算机二级的同学:公共基础知识总结!

    数据结构与算法 1.算法 算法:是指解题方案的准确而完整的描述. 算法不等于程序,也不等计算机方法,程序的编制不可能优于算法的设计. 算法的基本特征:是一组严谨地定义运算顺序的规则,每一个规则都是有效 ...

  9. Signal 第一个简单Demo

    最简单的聊天室功能 1.用 VS 2013 创建一个 MVC 4 (MVC 5 也类似)项目 1.1 选择模板为 基本 2.用 NuGet 安装 SignalR 3安装完成,我们来添加一个叫 MyHu ...

  10. codeforces #271D Good Substrings

    原题链接:http://codeforces.com/problemset/problem/271/D 题目原文: D. Good Substrings time limit per test 2 s ...