Les Hint Brushs

Écrit le 28/11/2003 par 00940
Dernière mise à jour : 01/02/2006

Introduction

Avant de commencer, pour utiliser les hintbrush vous devez avoir les zhlt, qui peuvent être trouvés sur Valve ERC . Ensuite, vous devez ajouter zhlt.wad a la liste de vos textures sous wc. Vous devriez aussi prendre les dernières version de worldcraft et le dernier patch pour Half-Life tant que vous y êtes.

Comment marche le VIS ?

VIS est l'abréviation de Visibility Information Set, en d'autres termes, ce que l'ordi pense que vous voyez. Le moteur ne calculera que ce que le VIS a déterminé comme étant visible, et a des problèmes si celui-ci essaye de calculer trop. Vous n'aurez besoin des hintbrush que si vos r_speeds sont trop élevés et que vous voulez les réduire en contrôlant manuellement ce que le VIS détermine comme étant visible. Les r_speeds qui nous intéressent ici sont les w_polys (chiffres du milieu). Des r_speeds en dessous de 600 sont nécessaire pour un gameplay fluide en multijoueur sur des machines un peu lentes. Le VIS calcule ce que vous pouvez voir en se basant sur les sections du VIS (visibility nodes en anglais) dans lesquels vous êtes. Des sections VIS extrêmement grandes pourrait amener l'ordi à penser que vous pouvez voir plus que vous ne voyez en réalité. Les sections VIS sont déterminées par les worldbrushs (bêtes blocs), les entitybrushs (func_wall p.e.) n'affectant pas le découpage en section du vis.

Que font les hintbrushs ?

Les hintbrushs divisent les sections VIS en de plus petits espaces, qui prennent plus de temps à compiler, mais cela peut réduire les r_speeds si c'est bien fait. Posons un grand hall avec plein de petites pièces annexes (fig. 1, vue d'en haut)

http://www.game-lab.com/images/tuts/hint_brushs/1.gif
fig. 1

Voici comment les sections VIS pourraient être découpées (notez que cela ne sera pas toujours découpé de la même façon, puisque cela dépend aussi de l'ordre dans lequel les polygones ont été placés dans wc ; notez aussi que le VIS découpe les rectangles en triangles rectangles, voir fig. 2).

http://www.game-lab.com/images/tuts/hint_brushs/2.gif
fig. 2

Maintenant, en vous plaçant n'importe où dans la section VIS du grand hall, l'ordi fera comme si le joueur pouvait voir tout (il calcule en se basant sur ce qu'il serait possible de voir depuis la section VIS, dans ce cas-ci, le niveau tout entier. Les lignes bleues représentent les lignes de vue depuis la section VIS, fig. 3) ce qui rendrait le niveau dégueulasse niveau r_speeds, bien que peu de polygones ne soient visibles depuis un lieu donné.

http://www.game-lab.com/images/tuts/hint_brushs/3.gif
fig. 3

Voici un exemple de hintbrushs utilisés de façon à régler partiellement cela (nous arriverons à un meilleur placement des hintbrushs dans une section ultérieure), fig. 4.

http://www.game-lab.com/images/tuts/hint_brushs/4.gif
fig. 4

Voici ce que le VIS pense que le joueur peut voir depuis le même point dans le hall maintenant ; notez la différence fig.5.

http://www.game-lab.com/images/tuts/hint_brushs/5.gif
fig. 5

Comment dois-je placer les hintbrushs dans mon niveau ?

Le terme de hintbrush est quelque peu erroné. Il s'agit en fait d'un brush avec la texture hint sur une seule face, le reste ayant la texture skip. Si vous utilisez un brush à 6 faces - ce que je recommande -, vous devez appliquer la texture skip à 5 faces et la texture hint à la restante. Ensuite, placez le brush de telle façon que la face avec la texture hint se trouve à l'emplacement exact où vous voulez que la section VIS soit découpée. Il doit être légèrement plus large que l'espace à découper, rentrant un peu dans les murs adjacents. Voici un screen dans wc d'un hintbrush, fig. 6.

http://www.game-lab.com/images/tuts/hint_brushs/6.gif
fig. 6

Comment puis-je savoir si ça marche ?

Vos r_speeds devraient chuter bien sur si vous avez utilisé les hintbrushs correctement. Mais, ajouter bêtement des hintbrushs ne va pas nécessairement réduire les r_speeds, vous devez encore les placer correctement. En fait, un mauvais usage des hintbrushs peut même augmenter les r_speeds ! Nous en verrons la raison plus loin. Vous verrez s'ils ont découpé le niveau correctement en le testant dans HL. Vous devriez être capable de voir quand vous passez d'une section VIS à une autre, puisque les r_speeds devraient soudain monter ou baisser. Si ces hausses et ces baisses surviennent au bon endroit, c'est que les hintbrushs fonctionnent.

Où dois-je placer mes hintbrushs ?

En se basant sur le premier schéma, il semblerait plus naturel de placer ses hintbrushs ainsi, fig. 7 et fig. 8

http://www.game-lab.com/images/tuts/hint_brushs/7.gif
fig. 7
http://www.game-lab.com/images/tuts/hint_brushs/8.gif
fig. 8

Le résultat sera de réduire légèrement les r_speeds au prix d'un temps de compilation augmenté. Cependant, si le joueur se déplace, dans d'autres sections, le bénéfice sera perdu. Et à certains endroits, c'est même pire, fig. 9.

http://www.game-lab.com/images/tuts/hint_brushs/9.gif
fig. 9

Comparons avec la 1ère découpe, fig.10.

http://www.game-lab.com/images/tuts/hint_brushs/10.gif
fig. 10

La deuxième approche est plus rentable aux extrémités de la pièce mais n'est pas si bonne au milieu. Or, c'est souvent au milieu que les r_speeds sont les pires. Je vous recommanderais donc de vous contenter de la première méthode, à moins que vous n'ayez du temps et de la RAM à perdre, auquel cas vous pourriez appliquer les 2 méthodes simultanément, fig. 11. Cela vous ferait gagner bien plus, mais au détriment du temps de compilation. Gardez toujours ceci en tête : doubler le nombre de section VIS QUADRUPLE le temps de compilation (j'expliquerai pourquoi plus loin).

http://www.game-lab.com/images/tuts/hint_brushs/11.gif
fig. 11

La raison de l'efficacité relative de la première approche vient des coins du hall qui bloque le champs de vision des secteurs VIS du hall, le tout étant de garder une marge pour être sûr que l'on ne puisse voir les pièces adjacentes, fig. 12. Cependant, c'est généralement sans le moindre intérêt, puisque ces zones sont en général celles où les r_speeds sont les plus bas. Ne placez des hintbrushs que là où cela s'avère réellement nécessaire.

http://www.game-lab.com/images/tuts/hint_brushs/12.gif
fig. 12

Votre attention doit être attirée sur le fait que le placement des hintbrushs doit éviter une augmentation des r_speeds. Gardez toujours en tête que les hintbrushs découpent les brushs qu'ils interceptent. Par exemple si vous avez un mur plat qui se voit découpé par un hintbrush, le mur sera scindé, entraînant l'apparition d'au moins un w_poly supplémentaire, mais malheureusement probablement plus.

Où dois-je placer mes hintbrushs II ?

Un niveau est bien plus qu'un sol, des murs et un plafond (enfin ceci ne vaut que pour les bons niveaux). Ces bons niveaux comprennent un tas de trucs que les joueurs peuvent voir ou avec lesquels les joueurs peuvent interagir. Dans la map cs_library, un endroit était très problématique du point de vue du VIS parce que j'avais beaucoup de pc en func_breakable et de chaises déplaçables à un endroit, séparés par de petits murs. Le problème était que les murs de séparation ne montaient pas jusqu'au plafond, si bien que l'ordinateur pensait que tous les ordinateurs et chaises étaient visibles, amenant des r_speeds supérieurs à 1000. En employant les hintbrushs, on a pu mieux dire à l'ordi ce qui était réellement visible. Ceci pour dire que non seulement vous devriez faire un plan de votre architecture, mais encore planifier les entités incluses dans les pièces. Prenons cette map p.e., fig. 13 et 14, vue de haut, où les points roses représentent des entités en func_wall très détaillées, comme les chaises de bureau des préfabs d'HL.

http://www.game-lab.com/images/tuts/hint_brushs/13.gif
fig. 13
http://www.game-lab.com/images/tuts/hint_brushs/14.gif
fig. 14

Si le joueur se place en ce point, fig.15, l'ordi pensera que le joueur peut voir les 2 pièces bourrées d'entités gourmandes en polys et les calculera, alors que le joueur ne voit strictement rien.

http://www.game-lab.com/images/tuts/hint_brushs/15.gif
fig. 15

Si les hintbrushs avaient été mis de cette façon, fig. 16, cela aurait résolu le problème, fig. 17.

http://www.game-lab.com/images/tuts/hint_brushs/16.gif
fig. 16
http://www.game-lab.com/images/tuts/hint_brushs/17.gif
fig. 17

Remarquez que dans cette map, nous ne pouvons que réduire de moitié le nombre d'entités vues en même temps par le VIS, ce qui sera cependant bien suffisant pour sauver vos r_speeds. Mais chaque fois que vous employez un hintbrush, pensez d'abord à considérer le problème comme un problème de simple design ou de plan. Par exemple, on pourrait résoudre le problème de cette façon-ci aussi, fig. 18.

http://www.game-lab.com/images/tuts/hint_brushs/18.gif
fig. 18

En dernier ressort, c'est à vous de décider comment vous voulez mettre en place votre niveau, tant que vous maîtrisez les r_speeds. Les hintbrushs vous donnent une grande liberté dans la conception de votre niveau, pour rester plus fidèle à votre thème au lieu de faire un tas de corridors en forme de labyrinthe.

VIS, hintbrush et la 3ème dimension

Un aspect commun à toutes les bonnes maps est qu'elles sont véritablement en 3 dimensions. Elles comportent des rampes, des escaliers, des ascenseurs, etc, qui rendent le niveau bien plus intéressant. Malheureusement, le VIS est plus facile à comprendre quand il s'occupe des surfaces plates. Mais les hintbrushs seront nécessaires si vous décidez de vous lancer dans un niveau un peu élaboré, ce qui est sans doute le cas si vous lisez ce tuto. Jusqu'ici j'ai parlé des sections VIS comme étant en 3 dimensions. Elles montent normalement jusqu'au plafond, mais ce n'est pas toujours le cas, elles peuvent tout aussi bien être découpées horizontalement que verticalement. De plus, si vos murs n'atteignent pas le ciel, l'ordi va penser que vous pouvez voir tout ce qu'il y a derrière, fig. 19.

http://www.game-lab.com/images/tuts/hint_brushs/19.gif
fig. 19

Voici avec des bloqueurs de VIS, fig. 20.

http://www.game-lab.com/images/tuts/hint_brushs/20.gif
fig. 20

Souvenez vous que la section vis dans laquelle le joueur se trouve n'est pas au sol mais à la hauteur de ses yeux. Dans le cas du bureau de cs_library, j'ai du placer différents hintbrushs à l'horizontal, voici, fig. 21, où le joueur est devant les bureaux. A la fig. 22, on voit que, quand il saute, beaucoup d'ordinateur deviennent visibles.

http://www.game-lab.com/images/tuts/hint_brushs/21.gif
fig. 21
http://www.game-lab.com/images/tuts/hint_brushs/22.gif
fig. 22

Voici, fig. 23, ce que le joueur voyait avant la découpe avec hintbrushs ; et, fig. 24, ce que le joueur peut voir maintenant avec de nouveaux hintbrushs.

http://www.game-lab.com/images/tuts/hint_brushs/23.gif
fig. 23
http://www.game-lab.com/images/tuts/hint_brushs/24.gif
fig. 24

Remarquez que 3 hintbrushs sont nécessaires pour empêcher le joueur de voir les ordis et les chaises. Ceci dit, quand il saute, les ordis étant vraiment visibles, les r_speeds sautent à 800 ; il n'y a pas moyen avec les hintbrushs d'empêcher le joueur de voir ce qu'il voit vraiment. Il est important de rappeler qu'il ne s'agit ici que d'une visualisation en 2D d'un problème en 3D, bien plus complexe, vu le nombre de boxs et le couloir central. Cependant le principe général est bon. Ces hintbrushs m'ont quand même permis de descendre les r_speeds de 200 +/-.

Conclusion

Utilisez les hintbrushs prudemment, puisque doubler les sections VIS revient à quadrupler le temps de compilation. Placer les néanmoins si nécessaire, si vous avez de bonnes raisons pour ce faire.

Un petit aparté mathématique pour expliquer ce problème : la matrice du VIS est un triangle rectangle, avec 2 côtés égaux. Chaque fois que vous ajouter une section VIS, vous augmentez la longueur des côtés de la matrice (des côtés égaux, pas de l'hypoténuses). Le temps de compilation étant proportionnel à l'aire du triangle, on comprend désormais mieux pourquoi ce rapport quadruple.

La map cs_library a été mappée par xm177e2 et a servi d'exemple vu l'emploi particulièrement ingénieux des hintbrushs. Elle est disponible à cette adresse : http://games.jubii.dk/download/

Tout ce que j'ai appris des hintbrushs, je le tiens du tutorial de Geoffrey Dewans, un peu ardu pour bien des gens mais qui reste la référence. Je vous conseille d'aller le lire sur gamedesign après celui-ci. Un petit détail : il est écrit pour Quake 2, et ce qu'il appelle "detail brush" est l'équivalent du func_wall de HL.

NB : Ce tutorial est la traduction du tuto de xm177e2, disponible à cette adresse : http://countermap.counter-strike.net/ et est reproduit avec son autorisation.
Traduction par 00940.