Zh/Hint brush: Difference between revisions
Tag: Undo |
m (Multipage removal) |
||
(10 intermediate revisions by 4 users not shown) | |||
Line 1: | Line 1: | ||
{{ | {{LanguageBar|title = Hint 固体}} | ||
{{back|Tool textures#hint|Tool Textures}} | {{back|Tool textures#hint|Tool Textures}} | ||
{{:User:1416006136/Signature|time=Jan 1, 2023|machine=1}} | |||
[[File:Toolshint.gif|left|link=]] | [[File:Toolshint.gif|left|link=]] | ||
Hint 平面用于在编译时拆分 | Hint 平面用于在编译时拆分{{L|visleaf|可见性分支区域}},因此是优化 {{L|VVIS|Vis}} 地图编译阶段结果的一种方式。 | ||
它们通常被称为 Hint | 它们通常被称为 Hint {{L|Brush|固体}},因为它们以与普通世界固体相同的方式放置在地图中。Hint 平面由覆盖有 <code style=padding:0>tools/[[tool textures#hint|toolshint]]</code> 纹理的固体的一个边定义。可以通过为固体的多个边添加纹理或使用多个固体来定义多个 Hint 平面。固体的其他不充当 Hint 平面的一侧必须用 <code style=padding:0>tools/[[tool textures#skip|toolsskip]]</code> 覆盖;编译器将忽略这些面。 | ||
Hint 会自动绑定到其自己的[[VisGroup#VisGroups|自动可见组]],因此你可以轻松隐藏它们。 | Hint 会自动绑定到其自己的[[VisGroup#VisGroups|自动可见组]],因此你可以轻松隐藏它们。 | ||
== 为什么以及什么时候切分可见性分支区域 == | == 为什么以及什么时候切分可见性分支区域 == | ||
{{note | {{note|了解{{L|visleaves|可见性分支区域}}如何工作可能有助于你理解本文。}} | ||
有时,某些叶子(即“可见性分支区域”)形状比其他形状更受欢迎,仅仅是因为这种形状使这些叶子看到更少的其他叶子。每当看不到叶子时,就不会绘制叶子的内容,从而加快渲染速度。 | 有时,某些叶子(即“可见性分支区域”)形状比其他形状更受欢迎,仅仅是因为这种形状使这些叶子看到更少的其他叶子。每当看不到叶子时,就不会绘制叶子的内容,从而加快渲染速度。 | ||
Line 18: | Line 19: | ||
第一个示例与 [[#Examples|SDK 示例地图]]几乎相同。这是一个单人房间的侧视图,玩家和管道被一堵墙隔开: | 第一个示例与 [[#Examples|SDK 示例地图]]几乎相同。这是一个单人房间的侧视图,玩家和管道被一堵墙隔开: | ||
[[ | [[File:Hint example1.jpg|frame|left|caption|sdk_hints.vmf 示例地图的侧视图,玩家从左侧开始,模型在右侧,由一堵墙隔开。]]{{clr}} | ||
当玩家处于两个 player_start 中的任何一个时,引擎必须考虑是否应该绘制墙壁右侧的固体(管道)。发生这种情况是因为 <code style=padding:0>vbsp.exe</code> 没有采取最有效的方式将我们的关卡划分叶子: | 当玩家处于两个 player_start 中的任何一个时,引擎必须考虑是否应该绘制墙壁右侧的固体(管道)。发生这种情况是因为 <code style=padding:0>vbsp.exe</code> 没有采取最有效的方式将我们的关卡划分叶子: | ||
[[ | [[File:Hint example2.jpg|frame|left|caption|没有任何 Hint,vbsp 制作了一直延伸到天花板的叶子。]]{{clr}} | ||
因为叶子很高,一直到天花板,所以左边的叶子(和玩家一起)可以用管道直接“看到”右边的叶子。因此,引擎将绘制叶子和内容物(管道)。很遗憾,因为从玩家的角度看不到这些管道(它们在中间的墙后面)。我们可以使用 Hint 来引导叶子制作过程。 | 因为叶子很高,一直到天花板,所以左边的叶子(和玩家一起)可以用管道直接“看到”右边的叶子。因此,引擎将绘制叶子和内容物(管道)。很遗憾,因为从玩家的角度看不到这些管道(它们在中间的墙后面)。我们可以使用 Hint 来引导叶子制作过程。 | ||
[[ | [[File:Hint example3.jpg|frame|left|caption|创建单个水平 Hint 会创建多个叶子,并且墙两侧的两片叶子无法相互看到。]]{{clr}} | ||
白线是带有工具 <code style=padding:0>tools/toolshint</code> 纹理的画笔的一面。它迫使 <code style=padding:0>vbsp</code> 将我们的地图分成三片叶子。在这种情况下,不能再有一条从玩家所在的叶子到管道所在的叶子的直线。这就是 Hint 的本质。 | 白线是带有工具 <code style=padding:0>tools/toolshint</code> 纹理的画笔的一面。它迫使 <code style=padding:0>vbsp</code> 将我们的地图分成三片叶子。在这种情况下,不能再有一条从玩家所在的叶子到管道所在的叶子的直线。这就是 Hint 的本质。 | ||
{{L|Skybox|天空盒}}有时有点高,导致玩家在城市中看到很多东西,因为他们所在的叶子可以看到房屋(如上例所示)。这也是一个很好的情况,我们可以使用 Hint 来阻挡可见性。 | |||
== 角落 Hint == | == 角落 Hint == | ||
[[ | [[File:Hint example5.JPG|thumb|200px|right|caption|如果没有 Hint,当站在对面的角落时,这条走廊的任何角落都会被渲染。]] | ||
这是一个典型角落的俯视图。有两个玩家(绿色盒子),两端的圆柱代表了很多引擎要绘制的东西。在这种情况下,Hint 的目标是避免在不必要的情况下渲染对象,例如,当玩家在远离对象的拐角处时。 | 这是一个典型角落的俯视图。有两个玩家(绿色盒子),两端的圆柱代表了很多引擎要绘制的东西。在这种情况下,Hint 的目标是避免在不必要的情况下渲染对象,例如,当玩家在远离对象的拐角处时。 | ||
Line 41: | Line 42: | ||
无论哪种方式,两个角落的叶子彼此直接可见,因此当站在相对的角落时,每个角落的内容将始终渲染。{{clr}} | 无论哪种方式,两个角落的叶子彼此直接可见,因此当站在相对的角落时,每个角落的内容将始终渲染。{{clr}} | ||
[[ | [[File:Hint example4.jpg|thumb|200px|right|caption|添加倾斜的 Hint 画笔会创建无法看到彼此的角落叶子。]] | ||
只需在角落放置一个 Hint,将我们的关卡分成三片叶子(总共三片而不是两片),但要确保一个玩家的东西不会从另一个玩家的角度渲染,就可以大大改善这种情况。 | 只需在角落放置一个 Hint,将我们的关卡分成三片叶子(总共三片而不是两片),但要确保一个玩家的东西不会从另一个玩家的角度渲染,就可以大大改善这种情况。 | ||
红色和棕色叶子之间没有直接的视线,因此避免了不必要的渲染。但是,如果其中一个玩家进入绿色的叶子,他们将看到自己和另一个玩家的东西都被渲染。你无法用 Hint 来阻止这种情况。阻止这种情况的唯一方法是更改关卡布局或使用其他方法,如 | 红色和棕色叶子之间没有直接的视线,因此避免了不必要的渲染。但是,如果其中一个玩家进入绿色的叶子,他们将看到自己和另一个玩家的东西都被渲染。你无法用 Hint 来阻止这种情况。阻止这种情况的唯一方法是更改关卡布局或使用其他方法,如{{L|Controlling Geometry Visibility and Compile Times|控制几何可见性和编译时间}}中所述的方法。{{clr}} | ||
== 更多示例 == | == 更多示例 == | ||
[[ | [[File:Hint example6.PNG|frame|caption|right|使用 Hint 的各种方法。]] | ||
以下是何时以及如何使用 Hint 的几个示例。在所有情况下,目标都是将绿色玩家彼此隐藏起来。上面的三个工作正常。左边的那个说明,即使它的一个 Hint 固体跨越角落也无关紧要,只要它的角度 > | 以下是何时以及如何使用 Hint 的几个示例。在所有情况下,目标都是将绿色玩家彼此隐藏起来。上面的三个工作正常。左边的那个说明,即使它的一个 Hint 固体跨越角落也无关紧要,只要它的角度 > 180°,两个玩家就不会“看到”对方的叶子,因为他们的叶子之间没有一条直线连接。左下角的示例显示了当角度小于 180° 时可能会发生何种情况。我们可以很容易地从叶子到叶子画一条直线,导致非功能性 Hint(Hint 没有达到它的效果)。 | ||
当走廊的拐角是 | 当走廊的拐角是 180° 时,如中间顶部图片所示,两个 Hint 就足够了。事实上,他们甚至可以更接近玩家,但这会降低他们的效率(更多的东西将在“拐角处”绘制。在中间底部的示例中,Hint 的高度已降低,<kbd>vbsp</kbd> 被迫切割顶部的 visleaf,因为 visleaf 不能是{{L|concave|凹形}}。无论 <kbd>vbsp</kbd> 如何切割这个角落,Hint 总是会降低工作效率并创建额外的叶子(vvis 的更多计算)。在示例中,左侧玩家可以看到叶子 1 和 2(与上面的面相同),但右侧玩家将看到所有三个编号的叶子(这比顶部示例更多)。 | ||
右边的两张图片告诉你,你应该让事情尽可能简单。如果一个 Hint 就足够了,如上例所示,则首选。而且,显然,如果不需要,则不应使用 Hint,如下图所示。如图所示,<kbd>vbsp</kbd> 无法创建使两个玩家都能看到对方的叶子,因此这里不需要使用 Hint 来隐藏玩家(当然,可以使用 Hint 来隐藏走廊的某些部分)。在同一示例中,中间墙''永远不应该''是 | 右边的两张图片告诉你,你应该让事情尽可能简单。如果一个 Hint 就足够了,如上例所示,则首选。而且,显然,如果不需要,则不应使用 Hint,如下图所示。如图所示,<kbd>vbsp</kbd> 无法创建使两个玩家都能看到对方的叶子,因此这里不需要使用 Hint 来隐藏玩家(当然,可以使用 Hint 来隐藏走廊的某些部分)。在同一示例中,中间墙''永远不应该''是{{L|func detail|细节固体}}(detail brushes)。细节几何图形不会创建可见性分支区域,并且 <kbd>vvis</kbd> 不会考虑这些几何图形。它会认为两个玩家都会看到对方,这不是我们想要的。<kbd>vbsp</kbd> 甚至可能会执行这个操作,所以这里的两个玩家都在同一片叶子里。 | ||
总之,由于 Hint 在游玩地图期间没有直接的渲染成本,因此如果使用得当,它们是'''加快地图速度和控制可见性的主要方法'''。 | 总之,由于 Hint 在游玩地图期间没有直接的渲染成本,因此如果使用得当,它们是'''加快地图速度和控制可见性的主要方法'''。 | ||
Line 62: | Line 63: | ||
最后,Hint 可用于简化地图。有时,<kbd>vbsp</kbd> 会将一个关卡切割成比必要的更多的叶子。这会增加编译时间。Hint 可用于抵消这种情况。例如,可以在门口放置 Hint,以防止门口切割它们连接的房间。或者,如果你收到某个叶子的错误,指出某个叶子正在穿过太多其他叶子,则可以使用 Hint 将该叶子切成多个叶子,从而穿过较少数量的叶子。 | 最后,Hint 可用于简化地图。有时,<kbd>vbsp</kbd> 会将一个关卡切割成比必要的更多的叶子。这会增加编译时间。Hint 可用于抵消这种情况。例如,可以在门口放置 Hint,以防止门口切割它们连接的房间。或者,如果你收到某个叶子的错误,指出某个叶子正在穿过太多其他叶子,则可以使用 Hint 将该叶子切成多个叶子,从而穿过较少数量的叶子。 | ||
{{note | {{note|Visleaf 将始终每 1024 个单位划分一次(在 2D 视图中的每一条红线或蓝线处)}} | ||
== 另请参阅 == | == 另请参阅 == | ||
* | * {{L|Visibility optimization}} | ||
* | * {{L|Skip}} | ||
* [[Material_Flags#.25CompileHint.28toolshint.29|%compilehint]],用于创建自定义 Hint 纹理。 | * [[Material_Flags#.25CompileHint.28toolshint.29|%compilehint]],用于创建自定义 Hint 纹理。 | ||
* | * {{L|Optimization (level design)}} | ||
== 示例 == | == 示例 == | ||
* <code>sourcesdk_content\hl2\mapsrc\sdk_hints.vmf</code> - Source SDK 中包含的示例地图。 | * <code>sourcesdk_content\hl2\mapsrc\sdk_hints.vmf</code> - Source SDK 中包含的示例地图。 | ||
{{ACategory|Level Design}} | |||
Latest revision as of 17:25, 12 July 2024
This page was translated by DaKang233 on January 1, 2023 (UTC+8). Anyone is welcome to add new content or fix errors. Some of the content was translated by machine.

Hint 平面用于在编译时拆分可见性分支区域 ,因此是优化 Vis 地图编译阶段结果的一种方式。
它们通常被称为 Hint 固体 ,因为它们以与普通世界固体相同的方式放置在地图中。Hint 平面由覆盖有 tools/toolshint
纹理的固体的一个边定义。可以通过为固体的多个边添加纹理或使用多个固体来定义多个 Hint 平面。固体的其他不充当 Hint 平面的一侧必须用 tools/toolsskip
覆盖;编译器将忽略这些面。
Hint 会自动绑定到其自己的自动可见组,因此你可以轻松隐藏它们。
为什么以及什么时候切分可见性分支区域

有时,某些叶子(即“可见性分支区域”)形状比其他形状更受欢迎,仅仅是因为这种形状使这些叶子看到更少的其他叶子。每当看不到叶子时,就不会绘制叶子的内容,从而加快渲染速度。
下面说明了叶片切割的重要性,同时提供了提示有用的示例。
第一个示例与 SDK 示例地图几乎相同。这是一个单人房间的侧视图,玩家和管道被一堵墙隔开:
当玩家处于两个 player_start 中的任何一个时,引擎必须考虑是否应该绘制墙壁右侧的固体(管道)。发生这种情况是因为 vbsp.exe
没有采取最有效的方式将我们的关卡划分叶子:
因为叶子很高,一直到天花板,所以左边的叶子(和玩家一起)可以用管道直接“看到”右边的叶子。因此,引擎将绘制叶子和内容物(管道)。很遗憾,因为从玩家的角度看不到这些管道(它们在中间的墙后面)。我们可以使用 Hint 来引导叶子制作过程。
白线是带有工具 tools/toolshint
纹理的画笔的一面。它迫使 vbsp
将我们的地图分成三片叶子。在这种情况下,不能再有一条从玩家所在的叶子到管道所在的叶子的直线。这就是 Hint 的本质。
天空盒 有时有点高,导致玩家在城市中看到很多东西,因为他们所在的叶子可以看到房屋(如上例所示)。这也是一个很好的情况,我们可以使用 Hint 来阻挡可见性。
角落 Hint
这是一个典型角落的俯视图。有两个玩家(绿色盒子),两端的圆柱代表了很多引擎要绘制的东西。在这种情况下,Hint 的目标是避免在不必要的情况下渲染对象,例如,当玩家在远离对象的拐角处时。
有人可能会认为 vbsp
会确保每个玩家不会看到属于另一个玩家的对象。这是错误的。它将这个空间分成两片叶子,沿着棕色或粉红色的线切割叶子(取决于 vbsp
首先切割哪个固体面)。
无论哪种方式,两个角落的叶子彼此直接可见,因此当站在相对的角落时,每个角落的内容将始终渲染。
只需在角落放置一个 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 将该叶子切成多个叶子,从而穿过较少数量的叶子。

另请参阅
- Visibility optimization
- Skip
- %compilehint,用于创建自定义 Hint 纹理。
- Optimization (level design)
示例
sourcesdk_content\hl2\mapsrc\sdk_hints.vmf
- Source SDK 中包含的示例地图。