Unity4.3遮挡剔除:故障排除

来源:互联网 发布:创维怎么看网络电视 编辑:程序博客网 时间:2024/05/01 18:48

Umbra和Unity联合开发Unity 4.3,这件事不足为奇了。随着Unity 4.3版本的发布,部分先进功能已对Unity Pro 用户开放。在此之前,我曾写过两篇文章。第一篇,介绍了遮挡剔除系统的基本用法和参数。第二篇,针对更好使用遮挡剔除系统的一般性建议以技巧。本文就针对Unity Pro 4.3中最新更新的遮挡剔除功能进行详细讲解。

可视化

为了让用户了解遮挡剔除的使用,Unity已提供了少量帮助文档。可视化操作可以帮助你直观地解决遮挡剔除的一些故障问题。可从遮挡窗口内找到可视化面板,还可在面板中选择相机。

在遮挡剔除对话框中,可以开启或关闭场景视图中的可视化窗口。

让我们看看有哪些不同的视觉效果。

相机体积

 “相机体积”(Camera Volume)的可视化能够通过一个灰色框,清晰的告知相机位置。其中关于储存格的更多信息,看看第一篇文章。这样就可以清楚,最小遮挡物的值是如何改变数据的输出分辨率。

可见线条

 “能见度线”可视化的目的是直观的展示出全影技术下的视野角度。它的工作原理是,利用全影技术,将遮挡物的深度呈现在画面上。这样,你就可以找到小孔或缝隙造成“漏光”处。这也说明,有些物体的遮挡能力在预期和实际情况中,未必一致。

虚拟空间

该“虚拟空间”的可视化,将以半透明、轴对齐的四边形绘制出所有路径。这不仅会让你清楚在全影技术下有多少个“虚拟空间”,改善遮挡剔除性能,也可以提供了另一种全影技术观察角度。所以,你可以通过虚拟场景中的遮挡状况,对现实场景进行估测。

故障排除

当遮挡剔除技巧用在Unity时,常会发生一些预期之外的故障。我将把遇到的最常见问题,以及如何解决的方法都总结出来,来供大家参考。

隐藏对象未被遮挡!

有时,人们想知道为什么有些本预测可见的对象,在全影技术下似乎被遮挡住了。原因其实有很多,主要是全影技术本身发展就很缓慢。

另一个要注意的是,遮挡数据代表的是场景遮挡物的简化版本。更具体地说,它表示一个传统的简化版本,这意味着会存在一些遮挡侵蚀和细节模糊化的问题。

 “最小遮挡物”会控制数据本身的细致程度,减小该值会产生更高分辨率的数据,但同时,剔除的过程也会降低速度,得到更大值的数据。

被挡住的可见物体!

也许最令人费解的情况是,物体利用全影技术呈现时,往往存在一种不应该出现的遮挡情况。毕竟取景技术始终是按部就班的,也没有一些错误的反馈,那这些情况是怎么发生的呢?

总结起来,有很多种情况。首先,也是最普遍存在的情况:你通过一个小孔或者是缝隙观察物体,而这些孔和缝隙都是被全影技术体素化过的。所以通常你应该尝试的第一件事是降低“最小孔”的值,看看是否能解决该问题。您可以尝试先将其适当调小,来测试一下是否是这里出的问题。

也有些效果不太明显的情况。例如,如果你的场景布置里有一个书架,其中每本书都被看做是个遮挡物,“最小孔”的值如果过大的话,它们可能被其它书或者书架所遮挡。同理,减少“最小孔”的值,应该是你首先要做的事。

此外,“隐性限制”(backface limit)值被设定低于100,而照相机处于后三角区(back-facing triangles)周边位置时,也会造成物体消失的情况。

因此,可以先将“隐性限制”值设定成100,看看是否能解决这个问题。如果可以,在适当的调整它的几何形状,重建asset模型,或者只是移除那些问题对象的“static occlude”标帜。如果你不在乎遮挡数据的大小或者在隐性优化(backface optimization)中没有得到便利的话,也可以单纯的将它的值设定成100就好。

剔除异常!

如果摄像机进入了一个遮挡物里面或者很接近它时,剔除功能就会很奇怪。比较有代表性的是第三人称那种视角。因为全影技术都是把遮档物作为固体来计算,从里面剔除就意味着把场景内大多数物体都剔除了。在物体的另一面,如果启用了背面检测,在此位置上的很多遮档物就会从计算数据中移除掉,不会进行计算,基于这种情况,最好不要将视角进入到遮档物里面!

更具体一点,在摄像机离遮档物的距离比设置视野最小值大时,全影技术能够保证剔除。在大多数情况下,要更接近的仍然是可行的,但在某些情况下,因为该三维像素的分辨率意味着在遮挡数据的准确性的限制,将超级接近的遮档物,可能会导致相机被错误地分配到一个位置内的遮档物。”相机卷”(camera volume)基本可以看到指定区域的全部样子。

通常当背面检测开启了(背面临界值小于100),全影技术将更好的为附近遮档物进行计算(剔除其它),因为它能够检测遮档物内部相应并相应地对他们之间的有效位置进行扩大,这样就算去接近任意的遮档物,都可以得到正确的计算结果。所以,如果你不能防止相机会非常接近遮档物(甚至进入遮档物内部)。那么第一件事就是设置背面临界值要小于100,这将有助于解决异常问题。如果重置了背面临界值还是没有帮助,或者相机需要进行物体的内部深处,那唯一就只能采取一个简单的办法,就是从对象中删除遮档标志。

剔除太慢了!

其实运行慢的原因很简单,;利用全影技术经过很多物体时,能见度的计算解析需要相当长的时间,而控制遮档数据处理遮档值的则是所有遮档物中最小的遮档物。较大的值会产生较低分辨率的物体图,这样可以更快的遍历到每一个点。但这不是绝对的,当不得不去简化遮档物数据时,有时一个较低分辨率的图形增加时,可能会导致该视图的距离增加,并且与它穿过的物体总量也会增加。这也不算是最典型的情况。在一般情况下,一大堆很小的遮档物产生的数据可以在运行处理中得到更快的速度,因为这样做减少了遮档物的精度成本。

还有一种方式来优化,但这种方式更加艰苦麻烦,修改场景内的几何形状,确保遍历物体数量不会太多而失控,在有问题的地方使它距离不要太长。手动插入物体闭塞到开放的区域可以使导线更早终止,从而减少物体的计算数量,使剔除系统执行更快。

烘焙太慢!

烘焙的速度很大程度上取决于一件事:需要处理的像素数。反过来,处理的像素数由两个因素来定义:场景的尺寸和像素的大小。假设你无法控制前者,但可以容易地用孔的最小参数来控制后者。当然,参数值越大,烘焙的速度越快。因此,设定一个相对大的数值是很有必要的。如果物体由于放置遮光板而产生错误的数据,继而消失了,就应该把参数值调小一些。一个极小的孔可能导致烘焙时间更久或者消耗惊人数量的内存。

遮挡数据太大!

如果烘焙场景产生过多遮挡数据,可以尝试以下几种方法。首先把隐面限制数值调到小于100,例如说99,50,甚至是30,这也许是一个良好的开端。如果这样做,要确保剔除在相机可能存在的每一个区域都正常工作。请参阅以前的帖子获取更多信息。

如果改变隐性限制数值不是良策,产生了不可预知的结果或者没能减少数据大小,可以通过提高最小遮光板的数值,它决定了遮挡数据的分辨率,会对数据的大小产生显著的影响。注意:提高最小遮光板的数值也会提高结果的保守性。

最后,值得一提的是,大场景自然比小场景产生更多的遮挡数据。遮挡数据的大小显示在遮挡窗口的底端。

 “分相失败”

在某些罕见的情况下,场景会过大而最小的遮光板参数已被设定为一个超小的值,烘焙可能出现“分相失败”的错误。这是因为烘烤的第一步尝试细分场景为计算瓷砖。细分是基于最小遮光器参数的,当场景十分巨大(例如,四面八方绵延千里)就会产生过多的计算瓷砖,导致内存不足的错误。这反过来,会向用户显示“分相失败”。增加最小遮光板的数值或把场景分割成小块将消除这个错误。

本系列关于Unity4.3的三篇教程到此结束了,了解更多的全影技术的内容,请访问www.umbrasoftware.com

0 0