[翻译]CryEngine3中裁剪剔除解释
CryEngine3中裁剪剔除解释
概述
在3D渲染方面早期的裁剪主要是描述了各类物体(Objects ,drawcalls,Triangles和 Pixels)被剔除,不会显示到最终图像的。在渲染管线中不同阶段剔除物体已经有很多技术。一些技术是基于软件模拟完全依赖于CPU的,一些是通过硬件GPU进行处理依赖于显卡的。了解这些技术来达到良好的性能是非常有帮助。要省略尽可能多的处理工作,一方面剔除工作越早进行,剔除的越多越好。另一方面剔除工作本事又不能太消耗性能和内存。为了确保良好的性能我们需要自动平衡这个系统。最然会使得系统特点有一些难理解,但是是为了更好的性能。
通常引擎的裁剪发生在DrawCall层级或者多重DrawCalls的时候,我们我们不会深入到三角形层级或者更深的层级,因为这样往往效率是不好的。这意味着只需要将场景中大量的物体分割到不同的区域,并保证不是所有的区域都会被渲染就可以了。
视锥体裁剪
视锥体裁剪是每一个好的3D应请都要做的基础技术。最简单的方式是,场景中的所有物体都与视锥的平截头体做交互检测。这个检测可以是保守的,这意味着它可以接受一些检测可见但实际不可见的对象,这可以通过对象的包裹图元进行近似的优化。我们使用AABB盒子(axis aligned bounding boxes)或者OBB盒子)(oriented bounding boxes)。当我们对平截头体进行检测的时候,可以按对象的近似体这个层级来做可见度测试,同时通过递归下降到Draw Call的层级。视锥体裁剪在引擎与硬件层都是独立的,有关的结构以包裹盒来存储。
不使用静态裁剪技术
我们要刻意避免静态技术如早期3D引擎的通用预处理技术PVS(Potential Visibility Set),PVS最大的优点是运行性能与成本非常小,但是在现代的计算机上这点成本却很少关注。创建PVS通常是一个非常耗时的预处理过程,这对现代大规模的游戏世界是非常糟糕的。游戏通常需要进行几何体的更新(如开门关门,建筑物破坏),PVS的静态场景不能很好的适合他。通常避免使用PVS或者类似的预处理技术,我们甚至可以节省一些对于主机游戏非常宝贵的内存。
Protals技术
PVS之外另外一种流行的做法是Protals技术,Protals通常是手动设置的2d凸多边形。这个想法是如果一个Protal是可见的(简单的认为对象是简单图元)。则Protal背后的世界部分是会被渲染那的。如果这世界部分是被认为可见的,几何体可以与Protal形状进行进一步交集检测来做更多的裁剪。通过Protals分离世界区域,设计者可以创建高效的关卡。好的Protal位置在狭窄区域如门可以有利于裁剪门以外的环境区域来提高性能。有可以是自动的放置Protal算法,但是如果挂卡设计师没有在优化过程中优化很可能性能不能达到最佳。手动放置Protal可以较少自动处理上的耗时,而且额外使用的内存很少,还可以做一些动态更新。Protals可以作为开关(如门等)。有些引擎甚至还利用了Protal做了特殊效果(例如镜子,teleporter等。在CryEngine中Protals是专门用来改进渲染性能的。我们进一步不扩展使用Protals。这也是因为保持代码和Protal流程的简单与有效。Protals他其特有的优势,但对于关卡设计师来说要做更多的努力,往往很难找到好的Protal位置。如城市中或纯天然开放的场景中经常不能有效的使用Protal。CryEngine虽然提供Protals功能,但只适用于可以比coverage buffer有更好性能表现的地方。
Ani Protals
Protal技术可以被反方向扩展,通常叫做Anti Protals.这些物体通常是凸2D或3D可以与其他Protals咬合。想象一下,一个有大柱子的房间并且有多个们连接到其他房间。这是一个很难使用Protal典型的例子,但是是应用Anti-Protals的典型例子。Anti-Protals可以用与对象交互的几何体来实现, 但这个方法有一个问题,多个anti-protals会融合会有效率问题。替换anti-portals几何体。我们可以用coverage buffer的方式实现同样的目的,但性能优良
GPU的Z检测
现代的图形性显卡Z缓冲是用来解决表面隐藏的问题的。这里有一个简单的解释:对于没一个屏幕上的像素都会存储一个摄像机与现实几何体上像素位置的距离信息叫做Z或者深度值。所有的可渲染对象都是由三角形构成。三角形所覆盖的所有像素都会与Z值进行比较。根据结果而定但侥幸上的像素是不是被剔除。这很好的解决了相交对象隐藏免的剔除问题。刚才提到的咬合(通常国人说Z竞争)问题可以作出进一步解决。Z值检测在渲染管线中执行的非常晚,这意味着引擎设置(如Skinning,Shader constancs)的消耗已经完成了。但在某些情况下它可以避免Pixel Shader的执行和帧缓冲的混合。其主要的目的是为了解决隐藏面的问题,通过对象由前向后的大致排序,剔除的表现会更好。Z-Pass(有些时候叫Z-Pre Pass)做的越早,作为最早的Pass越少的消耗在处理每一个像素的性能上。一些硬件甚至在被裁剪到的像素上性能可以到两倍的速度。我们需要输出这些数据用于建立G-Buffer用来做延迟渲染。
Z缓冲的精度是受像素格(24bit)式影响的。Z缓冲的范围是一个非常近似的Z值(非线性)。最近的Z值定义了某些物体(在被视锥近平面剔除后)可以被显示最近值。通过减半Z值(例如从10cm减到5cm)。你可以有效的提高一半Z缓冲的精度。它不会影响大多数物体的渲染。只是贴花体可以被正常的显示出来的,因为他们的Z值略高于他们下面的表面。这是一种很好的改进Z竞争的方法。
GPU Z Cull/HiZ
GPU有效的Z缓冲实现了碎片剔除在较早的阶段。这有助于较少像素渲染的执行。由于许多情况下的需要,允许这种优化和看似无害的改变可以会会打破这种优化,这个规则很复杂,还要取决于图形硬件。
GPU遮挡查询
现代图形卡的遮挡查询功能可以使CPU取回之前做过的Z缓冲检测的信息。这个功能可以用于实现更先进的裁剪技术。通过渲染一些遮挡体(最好是由前到后,大物体最先)。遮挡体对象可以用于可见检测。显卡硬件允许多个对象进行有效的检测,但有一个大问题。因为渲染的信息太大,如果一些对象是可见的将会被推迟很长一个时间显示(甚至很多帧)。这是不可以接受的,这意味着我们不能有效的检测。例如如果一些封闭的盒子是可见的,我们可以做更精细度子部分的测试。遮挡检测功能已经被引擎实现,并应用到海洋渲染。我们甚至使用大量的可见像素来实现反射的更新频率,遗憾的是我们也会得到一、两帧海洋是不可见的,这是因为观察点的位置发生了改变。这在Crysis里也发生了,当角色从潜艇里出来的时候。
软件的Coverage Buffer(cBuffer)
Z缓冲的性能取决于三角形数,顶点数和覆盖的像素数。这对于显卡硬件是非常块的,而对CPU是非常慢的。不过CPU不会有遮挡查询的延迟问题,现代的CPU可以执行的更快。这是为什么我们做了基于CPU的软件实现命名为”coverage buffer”。为了得到好的性能,我们使用简单的遮挡体。美术人员可以添加一些遮挡三角形或遮挡体来做对象包裹体的遮挡检测。动画对象不被考虑,这样做极大的优化了我们对对象的渲染,尽管可能出现一个对象应该被裁剪但我们还可以看的到的现象,但这是罕见现象。往往是因为一些不正确的美术资源造成的(例如遮挡多边形比物体大的多)。
Converage Bufer 与Z缓冲的回读
在某些硬件(如PS3或XBOX360)我们可以有效的复制Z缓冲到内存并使用它去做Converage Buffer的检测。这仍然会有延迟的问题,但很好的与Converage Buffer做了然间实现。她对于很多对象都是非常有效的。这样的方法会引入一帧的延迟。如快速的旋转可能成为一个问题。
背面裁剪
通常背面裁剪是对图形程序原来说可以是不用脑子的。根据三角形的方向,硬件不需要绘制背面的三角形,这样我们可以得到一些加速。只有做一些Alpha混合效果的时候我们需要关闭背面提出的效果。随着PS3上的需求,这个问题被重新考虑了,GPU的性能当处理顶点和提取数据时成为一个瓶颈,并且需要SPU到CPU的创建变化数据的好的连接。所以对于SPU的过度转换和三角形测试方面是值得努力的。用CPU有效实现来做视锥体剔除,合并小三角形,背面裁剪,模型蒙皮甚至是光照。这不是一个简单的工作。除了PS上需要保持特定的代码路径,CPU网格数据也是要可用的。在写这篇文章的时候我们还没有这样做。主要是因为内存的补助。我们可能重新考虑这个问题当CPU到内存的流处理被优化的时候。(使用此数据可能要处理一帧的延迟)
有条件的渲染
遮挡查询功能可以被应用到另外一个裁剪技术上。当在前面的Former pass裁剪掉后,许多DrawCall会被多遍Pass和subsequent pass中被避免。这需要一个遮挡查询和开销记录。在大多数硬件上是不会应用的,但在PS3的渲染器上可以通过访问Low Level来访问数据结构,所以开销较低。
高度图的射线检测Raycasing
高度图可以有效的进行射线检测,一些隐藏在地形背后的物体可以被裁剪。我们已经在CryEngine1中应用了这个技术,但由于我们现在有很多其他方法和将高度图数据变成压缩形式。这种技术变的不是那么有效了。这样看来自那时以来,随着硬件的变化,时间的推移,在计算能里高于内存性能的时候,裁剪技术可以被取代。
转载于:https://www.cnblogs.com/wanax/archive/2009/12/12/1622500.html
[翻译]CryEngine3中裁剪剔除解释相关推荐
- [翻译]CryEngine3中光照的美术提示
CryEngine3中光照的美术提示 概述 在传统的二维美术资源中(如精灵与背景绘制),美术人员可以对最后的效果有很直接的控制.结果是可以交互的调整效果而不用管将来资源被应用到关卡中的什么地方它都是一 ...
- [翻译]Python中yield的解释
问题: Python中yield关键字的作用是什么?它做了什么? 例如,我想理解以下代码 def node._get_child_candidates(self, distance, min_dist ...
- [翻译]CryEngine3中的Water Shader
Water Shader Water Shader用来创建海洋 1. 主要属性 1). 没有必要为Water Shaders设置Diffuse和Specular Maps,但需要一张Bum ...
- 【20220605】文献翻译——虚拟现实中的可视化:一个系统的回顾
Visualization in virtual reality: a systematic review 摘要 1 简介 4 结果和分析 4.1 工具.工具包和框架 4.2 数据可视化 4.3 信息 ...
- 如何在Word,Excel和PowerPoint 2010中裁剪图片
When you add pictures to your Office documents you might need to crop them to remove unwanted areas, ...
- css flexbox模型_CSS Flexbox在全国范围内的公路旅行中得到了解释
css flexbox模型 by Kevin Kononenko 凯文·科诺年科(Kevin Kononenko) CSS Flexbox在全国范围内的公路旅行中得到了解释 (CSS Flexbox ...
- 堆叠自编码器中的微调解释_25种深刻漫画中的编码解释
堆叠自编码器中的微调解释 by freeCodeCamp 通过freeCodeCamp 25种深刻漫画中的编码解释 (Coding Explained in 25 Profound Comics) W ...
- 如何在Microsoft PowerPoint中裁剪图片
You can remove unnecessary pixels from an image directly in Microsoft PowerPoint using the built-in ...
- 计算机科学与技术中英翻译,[精品]计算机科学与技术外文翻译、中英对照、英汉互译.doc...
[精品]计算机科学与技术外文翻译.中英对照.英汉互译 毕业设计(论文)外文资料翻译 学院(系): 计算机科学与技术学院 专 业: 计算机科学与技术 姓 名: 学 号: (用外文写)外文出处: (用外文 ...
最新文章
- matlab实现滑动平均滤波(二)
- xxl子任务_阿里面试官:聊一下分布式任务调度有那些解决方案?
- Hibernate4多对多关系映射
- WINCE6.0+S3C2443的启动过程---eboot2
- 华大 MCU 之六 SEGGER Embedded Studio 及 Ozone 使用 Jlink 调试
- 【ArcGIS微课1000例】0011:ArcGIS空间查询(按位置选择Select by Location)完全案例详解
- 基于samba实现win7与linux之间共享文件_阳仔_新浪博客
- datatables ajax错误,ajax datatable - DataTables警告:table id = example - 无法重新初始化DataTable(示例代码)...
- C#中创建线程的四种方式
- python产生随机数的函数_Python 随机数函数
- 2019马哥python的百度网盘_马哥 2018 Python 全栈视频
- layui使用treeTable实现树形表格
- LeetCode 739. 每日温度(java实现)
- H266 ISP 帧内子划分
- 如何使用 Alink 进行中文情感分析?
- EfficientNet介绍
- 小波包matlab,小波分析(第三讲)小波包二代小波Matlab工具使用
- 从小市值因子策略入手,带你入门量化投资 (附年化收益率77.83%策略)
- 动态SQL中if标签:test判断的null和“ “的问题
- 亚马逊要求化妆品提交HRIPT / RIPT测试报告和COA证书详情解析