Hint brush/zh

From Valve Developer Community
Jump to: navigation, search

本页面由大康翻译于2023年1月1日 (UTC+8)。欢迎任何人补充新内容或者修改其中的错误。部分内容由机器翻译。


Toolshint.gif

Hint 平面用于在编译时拆分可见性分支区域,因此是优化 Vis 地图编译阶段结果的一种方式。

它们通常被称为 Hint 固体,因为它们以与普通世界固体相同的方式放置在地图中。Hint 平面由覆盖有 tools/toolshint 纹理的固体的一个边定义。可以通过为固体的多个边添加纹理或使用多个固体来定义多个 Hint 平面。固体的其他不充当 Hint 平面的一侧必须用 tools/toolsskip 覆盖;编译器将忽略这些面。

Hint 会自动绑定到其自己的自动可见组,因此你可以轻松隐藏它们。

为什么以及什么时候切分可见性分支区域

Note.png注意:了解可见性分支区域如何工作可能有助于你理解本文。

有时,某些叶子(即“可见性分支区域”)形状比其他形状更受欢迎,仅仅是因为这种形状使这些叶子看到更少的其他叶子。每当看不到叶子时,就不会绘制叶子的内容,从而加快渲染速度。

下面说明了叶片切割的重要性,同时提供了提示有用的示例。

第一个示例与 SDK 示例地图几乎相同。这是一个单人房间的侧视图,玩家和管道被一堵墙隔开:

sdk_hints.vmf 示例地图的侧视图,玩家从左侧开始,模型在右侧,由一堵墙隔开。

当玩家处于两个 player_start 中的任何一个时,引擎必须考虑是否应该绘制墙壁右侧的固体(管道)。发生这种情况是因为 vbsp.exe 没有采取最有效的方式将我们的关卡划分叶子:

没有任何 Hint,vbsp 制作了一直延伸到天花板的叶子。

因为叶子很高,一直到天花板,所以左边的叶子(和玩家一起)可以用管道直接“看到”右边的叶子。因此,引擎将绘制叶子和内容物(管道)。很遗憾,因为从玩家的角度看不到这些管道(它们在中间的墙后面)。我们可以使用 Hint 来引导叶子制作过程。

创建单个水平 Hint 会创建多个叶子,并且墙两侧的两片叶子无法相互看到。

白线是带有工具 tools/toolshint 纹理的画笔的一面。它迫使 vbsp 将我们的地图分成三片叶子。在这种情况下,不能再有一条从玩家所在的叶子到管道所在的叶子的直线。这就是 Hint 的本质。

天空盒有时有点高,导致玩家在城市中看到很多东西,因为他们所在的叶子可以看到房屋(如上例所示)。这也是一个很好的情况,我们可以使用 Hint 来阻挡可见性。

角落 Hint

如果没有 Hint,当站在对面的角落时,这条走廊的任何角落都会被渲染。

这是一个典型角落的俯视图。有两个玩家(绿色盒子),两端的圆柱代表了很多引擎要绘制的东西。在这种情况下,Hint 的目标是避免在不必要的情况下渲染对象,例如,当玩家在远离对象的拐角处时。

有人可能会认为 vbsp 会确保每个玩家不会看到属于另一个玩家的对象。这是错误的。它将这个空间分成两片叶子,沿着棕色或粉红色的线切割叶子(取决于 vbsp 首先切割哪个固体面)。

无论哪种方式,两个角落的叶子彼此直接可见,因此当站在相对的角落时,每个角落的内容将始终渲染。

添加倾斜的 Hint 画笔会创建无法看到彼此的角落叶子。

只需在角落放置一个 Hint,将我们的关卡分成三片叶子(总共三片而不是两片),但要确保一个玩家的东西不会从另一个玩家的角度渲染,就可以大大改善这种情况。

红色和棕色叶子之间没有直接的视线,因此避免了不必要的渲染。但是,如果其中一个玩家进入绿色的叶子,他们将看到自己和另一个玩家的东西都被渲染。你无法用 Hint 来阻止这种情况。阻止这种情况的唯一方法是更改关卡布局或使用其他方法,如控制几何可见性和编译时间中所述的方法。

更多示例

使用 Hint 的各种方法。

以下是何时以及如何使用 Hint 的几个示例。在所有情况下,目标都是将绿色玩家彼此隐藏起来。上面的三个工作正常。左边的那个说明,即使它的一个 Hint 固体跨越角落也无关紧要,只要它的角度 > 180°,两个玩家就不会“看到”对方的叶子,因为他们的叶子之间没有一条直线连接。左下角的示例显示了当角度小于 180° 时可能会发生何种情况。我们可以很容易地从叶子到叶子画一条直线,导致非功能性 Hint(Hint 没有达到它的效果)。

当走廊的拐角是 180° 时,如中间顶部图片所示,两个 Hint 就足够了。事实上,他们甚至可以更接近玩家,但这会降低他们的效率(更多的东西将在“拐角处”绘制。在中间底部的示例中,Hint 的高度已降低,vbsp 被迫切割顶部的 visleaf,因为 visleaf 不能是凹形。无论 vbsp 如何切割这个角落,Hint 总是会降低工作效率并创建额外的叶子(vvis 的更多计算)。在示例中,左侧玩家可以看到叶子 1 和 2(与上面的面相同),但右侧玩家将看到所有三个编号的叶子(这比顶部示例更多)。

右边的两张图片告诉你,你应该让事情尽可能简单。如果一个 Hint 就足够了,如上例所示,则首选。而且,显然,如果不需要,则不应使用 Hint,如下图所示。如图所示,vbsp 无法创建使两个玩家都能看到对方的叶子,因此这里不需要使用 Hint 来隐藏玩家(当然,可以使用 Hint 来隐藏走廊的某些部分)。在同一示例中,中间墙永远不应该细节固体(detail brushes)。细节几何图形不会创建可见性分支区域,并且 vvis 不会考虑这些几何图形。它会认为两个玩家都会看到对方,这不是我们想要的。vbsp 甚至可能会执行这个操作,所以这里的两个玩家都在同一片叶子里。

总之,由于 Hint 在游玩地图期间没有直接的渲染成本,因此如果使用得当,它们是加快地图速度和控制可见性的主要方法

用于简化的 Hint

最后,Hint 可用于简化地图。有时,vbsp 会将一个关卡切割成比必要的更多的叶子。这会增加编译时间。Hint 可用于抵消这种情况。例如,可以在门口放置 Hint,以防止门口切割它们连接的房间。或者,如果你收到某个叶子的错误,指出某个叶子正在穿过太多其他叶子,则可以使用 Hint 将该叶子切成多个叶子,从而穿过较少数量的叶子。

Note.png注意:Visleaf 将始终每 1024 个单位划分一次(在 2D 视图中的每一条红线或蓝线处)

另请参阅

示例

  • sourcesdk_content\hl2\mapsrc\sdk_hints.vmf - Source SDK 中包含的示例地图。