z pre-pass 相关问题的讨论
z pre-pass
是指在渲染流程中,第一个pass先画一张深度buffer出来,得到需要绘制的最前面这层深度,用这个在接下来的pass中做深度剔出,这样在第二个pass中会省略很多绘制。
这项技术在渲染透明物体时可以的到理想结果。因为有了这层深度剔除,透明物体内部的错乱的内部结构就不会显示出来。
有关z pre-pass 的效率问题,实际上并不那么乐观。
http://casual-effects.blogspot.hk/2013/08/z-prepass-considered-irrelevant.html
http://www.gamedev.net/topic/641257-depth-pre-pass-worth-it/
这两位作者都做了测试,前者测试相当严格。结论是z pre-pass在forward+基本没有效率提升。
z pre-pass在第一个pass有从vertexshader到rasterize的开销。这个和后面用这张depth buffer剔除后面的绘制节省的开销在很多情况下是互相抵消,基本没多少优势。我想这也是AC2关掉z pre-pass的原因。但这会导致透明物体渲染次序的问题。
front-to-back
是指渲染opaque物体时从前向后画,开深度测试,这样后面的物体被前面物体遮住的部分就会被剔除,效率得到提升。
合并批次
是指把渲染状态相同的batch,顶点数据合并起来提交。一次绘制出来,减少drawcall的调用次数,进而也提升了效率。判断是否需要合并是通过batch的填充率满不满来决定的。如果batchsize不满,又是同样render state的批次,就应该合并起来。
但front-to-back 和合并批次有个矛盾的地方在于同样渲染状态的物体,比如一种类型的草,它们通常位于场景的各个位置,如果严格由近及远画,就会导致渲染状态反复被切换,就无法合并批次了。
针对这个问题,zxy和chenzhe讨论得出一个观点,如果做了z pre-pass就不需要 front-to-back 这样就可以合并批次了。
之前得到大家的一致认同,但后来我看了上述两篇文章意识到上述观点有如下问题:
z pre-pass绘制的时候 如果可以做front-to-back 也是可以极大提升这个阶段效率的,这是我们在讨论过程中一直忽视的一个问题。z pre-pass 和 front-to-back不是互斥的。
讨论的时候忽视了z pre-pass在第一个pass有从vertexshader到rasterize的开销。虽然是很简单的ps,从上文两个连接测试来看,前面这部分vs的开销也不少。
综述,z pre-pass加合并批次不见得是最优解。个人倾向在front-to-back和合并批次之间取个折中,即不那么严格的front-to-back排序。
引用Morgan McGuire (G3D作者)的话:
In other words, the z-prepass may be irrelevant in modern rendering systems that submit many draw calls for well-sorted objects,
and ispotentially harmful as tessellation (and thus rasterizer setup) and skinning workloads increase.
欢迎提出意见。
z pre-pass 相关问题的讨论的更多相关文章
- 【盛派周三分享-2019.2.20】开放分享内容,本期主题:《SCF、DDD及相关架构思想讨论》
“周三分享”是盛派网络约定的每周三晚上定时举办的内部分享活动,活动主要由技术人员分享各方面的技术主题,并由所有参与者围绕主题进行讨论.除技术话题外,也可能涉及到相关的设计.财税.金融.政策等方面的延伸 ...
- Tile based Rendering 二 tbr and tbdr 优化建议tiled based deferred rendering
http://www.seas.upenn.edu/~pcozzi/OpenGLInsights/OpenGLInsights-TileBasedArchitectures.pdf tbr 和tbdr ...
- 深入剖析GPU Early Z优化
最近在公司群里同事发了一个UE4关于Mask材质的优化,比如在场景中有大面积的草和树的时候,可以在很大程度上提高效率.这其中的原理就是利用了GPU的特性Early Z,但是它的做法跟我最开始的理解有些 ...
- 对博弈活动中蕴含的信息论原理的讨论,以及从熵角度看不同词素抽象方式在WEBSHELL文本检测中的效果区别
1. 从赛马说起 0x1:赛马问题场景介绍 假设在一场赛马中有m匹马参赛,令第i匹参赛马获胜的概率为pi,如果第i匹马获胜,那么机会收益为oi比1,即在第i匹马上每投资一美元,如果赢了,会得到oi美元 ...
- Python 3 条件、循环和assert、pass、del
条件: if 条件: 语句块 elif: 语句块 else: 语句块 elif 表示 else if 这居然是合法的!!!1 < x < 2!!! >> ...
- node相关的精典材料
node.js电子书 了不起的Node.js 深入浅出Node.js node.js入门经典 node.js开发指南 node.js相关优秀博文 官网 Infoq深入浅出Node.js系列(进阶必读) ...
- Android窗口管理服务WindowManagerService计算窗口Z轴位置的过程分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8570428 通过前面几篇文章的学习,我们知道了 ...
- e = e || window.event用法细节讨论
e = e || window.event是我们在做事件处理时候区分IE和其他浏览器事件对象时常用的写法.但是这行兼容性代码有没有必要出现在所有的事件句柄中呢?标准事件调用方式需要这行代码吗?下边我们 ...
- TCP三次握手四次挥手相关问题探讨
TCP的握手挥手和状态转换是很多网络问题的基础.在此进行相关问题的讨论及记录. 首先,这幅图大致介绍了TCP连接和断开的过程: 注意其中的几个状态: LISTEN, SYN-SEND, SYN-RCV ...
随机推荐
- Python+Selenium练习篇之15-在浏览器中新开一个tab
本文介绍如selenium方法打开一个新的tab,我们知道在浏览器里,我们按住 ctrl+ t 就可以新打开一个tab.所以我们学习如何利用webdriver中send_key 的方法去触发ctrl+ ...
- Python+selenium(警告框处理)
在Webdriver中处理JavaScript生成的alert.confirm.prompt,使用switch_to_alert()方法定位到alert.confirm.prompt,然后进行如下操作 ...
- Django框架学习-01Django介绍
01-Django介绍 02-HTTP协议介绍 01-Django介绍 1.什么是Web框架? 随着Web最新发展趋势的不断升级,Web项目开发也越来越难,而且需要花费更多的开发时间.所以,Web程序 ...
- Python 拓展之详解深拷贝和浅拷贝
正式开始 首先我在这介绍两个新的小知识,要在下面用到.一个是函数 id() ,另一个是运算符 is.id() 函数就是返回对象的内存地址:is 是比较两个变量的对象引用是否指向同一个对象,在这里请不要 ...
- DWR搭建以及使用教程
DWR搭建以及使用教程 DWR(Direct Web Remoting)是一个Ajax的开源框架,用于改善web页面与Java类交互的远程服务器端的交互体验,可以帮助开发人员开发包含AJAX技术的 ...
- tail /grep/more
1.tail -f 文件名 不断的刷新日志信息,实时的得到新追加到文件中的信息,常用来跟踪日志文件,如tail -f err.log Ctrl+C退出 2.grep '内容' 文件名 3.more 分 ...
- ZigBee学习四 无线+UART通信
ZigBee学习四 无线+UART通信 1) 协调器编程 修改coordinator.c文件 byte GenericApp_TransID; // This is the unique messag ...
- CentOS下Nginx部署React静态应用
查看CentOS版本: cat /etc/redhat-release 安装nginx: yum install nginx 查看nginx版本: nginx -v 启动nginx: systemct ...
- Swift实战-单例模式
设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.GoF提出了23种设计模式,本系列将使用Swift语言来实现这些设计模式 概述 整个应用生命 ...
- codeforce div2 426 D. The Bakery
D. The Bakery time limit per test 2.5 seconds memory limit per test 256 megabytes input standard inp ...