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