This article relates to the game "Half-Life: Alyx". Click here for more information.
This article relates to the workshop tools for "Half-Life: Alyx". Click here for more information.
This article's documentation is for Source 2. Click here for more information.

可见性

From Valve Developer Community
Jump to: navigation, search

English (en)русский (ru)中文 (zh)
... Icon-Important.png

为了地图编译能有高效的“vis”解决方案,确保你的地图有正确的几何体是非常重要的。《半衰期:爱莉克斯》的VIS解决方案通过内部/外部算法尝试在执行可见性计算时确定哪些是在地图“内部”。实际上,里面的任何东西都会被渲染,外面的任何东西都会被丢弃。

注意:预先计算的可见性提高了渲染地图的性能,但增加了地图编译时间。如果要禁用整个地图的预计算可见性,可以将“地图属性(Map Properties)”对话框中的“预计算可见性(Precomputed Visibility)”属性设置为“禁用(Disabled)”。

内部与外部

visbuilder将尝试自动确定地图内外的空间。其用于执行此操作的主要因素是几何体的正面和背面的可见性。一般来说,拥有直接视野足够多的几何体正面和视野相当有限的几何体背面的空间将标记在内部。当visbuilder运行时,任何通过外部空间的视线都将被消除。这样做是对"在地图构建方面没有任何限制"的弥补。地图中通常会包含一些不封闭的几何体或以某种方式重叠的几何体。在处理这些情况时,不应该因为某些有效的几何体穿过了这些表面,就强迫系统保存这些穿过部分的可见性信息。当这个算法失败时,最常见的原因是要计算的几何体出现意外漏洞。在查找其他问题之前检查要计算的几何体非常重要(在Hammer中使用vis preview)。通常你应该认为起源2的可见性是双向的。每个可见的空间也应该看起来像一个放置相机的有效空间。

基本用法

默认情况下,Hammer中内置的世界几何体将阻止可见性。可以在网格对象的对象属性中勾选“从VIS中排除(Exclude from VIS)”选项以禁用此选项。

“从VIS中排除(Exclude from VIS)”可用于Hammer网格以跳过可见性检查。

相反,默认情况下,每个实体类型都不会阻止可见性计算,包括“prop_”类型。这包括prop_static模型,它们通常太小而无法阻止任何合理的可视性,因此被完全跳过。任何你希望包含在vis解决方案中的prop_static几何体必须被标记为“Vis遮挡器(Vis Occluder)”。

勾选Vis遮挡器(Vis Occluder)使道具阻止可见性

各种材质类型(主要是工具纹理)也可以修改其应用于的几何体的行为。

以tools关键字过滤的Hammer材质浏览器

影响可见性的一些最常见的工具材质有:

  • tools/visblocker - 使用此工具纹理的表面将删除任何击中该面的视线。这对于阻止由于地图上的漏洞而产生的不需要的(但真实的)视线非常有用。如果你看到地图中的某些漏洞让地图文件中其他不应该可见的部分可见,你可以使用visblocker来阻止这些视线而不需要完全密封这个洞。
  • tools/toolsskybox - 使用此工具纹理的表面将形成有效的视线。当对世界进行体素化时,体素(voxels)会在包含几何体时被细分。如果体素中唯一的几何体是toolsskybox,则体素化将以更粗略的分辨率停止。这提高了可见性编译器的性能。
  • tools/toolsnodraw - 使用此工具纹理的表面将像普通可见表面一样工作。唯一的例外是内部/外部测试。在测试中,toolsnodraw将被有效地忽略。因此,如果一个体积中没有其他可见的几何体,那么这个体积可能会从PVS中消除。

在游戏中观察VIS

引擎可以对镜头位置进行记录,以便进行可见性调试。当回放记录时,PVS可视化调试器将为记录的镜头设置动画,并实时更新可视化。例如,你可以用这个来看看当你走在走廊上时VIS发生了什么变化。然后你可以飞出去,从一个不同的角度检查PVS。

可以使用以下控制台命令:

vis_enable 0/1 切换预先计算的可见性系统。vis_enable 1为默认值,vis_enable 0关闭PVS。
vis_debug_show 这将显示PVS可视化调试器。镜头位置渲染为红色球体,将以白色渲染截面,可见叶将渲染为绿色线框轮廓。你可以独立地移动镜头和观察记录的PVS可视化调试器。
vis_debug_record_start 开始录制镜头截锥以供回放。
vis_debug_record_stop 停止录像。
vis_debug_find_los 这将发现记录镜头的当前位置(叶包含被记录的绘制成红色的镜头)和实际镜头的位置(叶被绘制成蓝色)之间的任何视线。连接这两个叶块的视线用黄色绘制。这告诉你为什么PVS认为在记录的镜头位置可以看到另一个位置。
vis_debug_tracelos 使用此选项可以修复从当前镜头位置应该可见但不可见的内容。它将跟踪覆盖当前屏幕的光线网格,并更新vis以包含找到的任何新视线。这些视线记录在los.bin文件中,以备将来的地图编译。
vis_debug_lock 切换锁定VIS视线原点到当前镜头位置的开关。
vis_debug_currentcluster 将当前叶的编号打印到控制台。
vis_debug_dumpvisibleclusters 将可见叶的列表打印到控制台。
vis_debug_drawcluster 将叶#添加到可视化,(-1)为清除。

在Hammer中查看VIS

使用“可见性贡献者(Visibility contributors)”视图切换不影响VIS的任何几何体。此模式隐藏了任何不会阻挡视觉的几何体,使其更容易发现地图中的错误。举个进一步的例子,加载工具附带的地图。

Visibility-128485606.png

有关在Hammer中加载VIS叶数据请参考加载已编译的Vis数据

Visibility-128485607.png

最佳做法/常见问题

本文的其余部分将重点讨论一些更常见的问题和最佳实践。

在地图边界上避免在vis中形成漏洞

尽管这不是完全必要的,但如果在地图周围有一个封闭的vis外壳,清晰地定义地图边界,那么vis将产生最好的结果。这种几何结构中的漏洞可能导致vis将额外的空间包围在漏洞周围。Toolsskybox材质通常用于定义地图的边界,否则它将对天空盒开放。

地图边界上的一个漏洞导致vis延伸到空旷的空间。

不要使用SkyVisBlocker

skyvisblocker材质已弃用,不应该使用。你必须使用toolsskybox纹理来封闭被认为是天空盒“开放”的地图部分,visblocker应该用来阻挡视线而不影响vis的结果。作为优化,天空盒不会在不使用toolsskybox的场景中渲染。

skyvisblocker被用来封住关卡而不是tooksskybox导致了意想不到的结果。请注意左边的大叶子是在外部的。

小心使用固体挡光

“固体挡光”材质或toolssolidblocklight是一个固体但不可见同时也阻挡了光的表面。实际上,这与toolsnodraw的功能相同,但也阻挡了光线。例如,建筑的屋顶应该挡住光线,但玩家也可以向屋顶投掷手榴弹。

它不应该在不应该生成vis叶的空间中使用。toolsblocklight材质可以用来阻挡光线(投射阴影)而不需要添加vis叶。

在地图外使用toolssolidblocklight导致不必要的vis叶被添加。

在地图边界上避免面向外的几何体

构成地图外壳的几何体应该始终面向内部。如果外壳部分朝外,不仅会产生类似于一个洞的效果,而且可能会产生额外的不需要的视线,导致vis进一步填补空白。

在地图的边缘有一面向外的墙,使空间充满了视线。

避免通过地图边界扩展

产生vis的几何体不应该穿透地图的外壳。类似于向外的几何体,这可能导致不需要的视线,并导致vis填补空白。

建筑屋顶穿过地图的边界,从而增加了额外的空间。

避免将对象放置在地图外

如果你已经创建了一个封闭的地图边界,那么所有不属于3D天空盒的几何体都应该在地图的外壳内,即使它不会对vis产生影响。外壳之外的对象将被vis以一种不需要的方式移除,部分或全部对象将被移除。

整个水塔物件位于地图可见区域之外,不会出现在游戏中,根据其位置,应该放在天空盒中。