logo
Connexion
 
Pseudo : 

Mot de passe : 


Perdu le mot de passe ?

Inscrivez-vous maintenant !

Tutoriaux, Guides
 

Menu principal
 

Qui est en ligne ?
 21 utilisateur(s) en ligne

Membre(s): 0
Invité(s): 21

plus...

Sondages
 
Etes-vous pour la création d'une partie ET:QuakeWars
Oui, une section ET:Quakewars façon site/thème changeant
Oui, une section ET:Quakewars façon forum supplémentaire
Non, pas de ET:Quakewars ici

Partenariat
 
Visualiser tous les Partenaires...

Optimisation : Leafs et Hint brushs
Optimisation : Les Leafs et les Hint brushs

ou

"Leaf node" et "Hint brush" : Comment que ça compile ?

 

 

 

 

 

 

  • A quoi va me servir ce tuto ? :


Je vais essayer de vous faire assimiler l'optimisation de la compilation (élément majeur du mapping) par quelques exemples et quelques notions élémentaires comme la différence entre un brush "structural" et un brush "detail".
Plus loin dans le tuto, on verra l'utilisation des brushs "hint".
 

  • Avant de commencer :
      • Commande de la console :

      Pour ce tutorial vous devez utiliser la commande de la console de ET, "/r_showtris 2".
      Cette commande permet d'afficher tous les triangles affichés par le moteur graphique à un endroit donné.
      Pour désactiver cette commande, il suffit de taper "/r_showtris 0"

      • Concernant les "brushs" :

      Il y a 2 types de brush. Les brushs "structural" et les brushs "detail".
      Les brushs "structural" sont les brushs par défaut que vous créez sous Radiant. Donc par défaut quand je parle de brush, j'assimile ce terme à brush "Structural".
      Les brushs "detail" seront expliqués plus tard.

Allez hop on commence !

Bon alors avant de voir ce que fait le compilateur, regardons l'intérieur d'un fichier .map
 

{"classname" "worldspawn"

// brush 0
{
( 2104 -344 -1248 ) ( 2104 -360 -1248 ) ( 2104 -360 -1264 ) common/caulk 16 0 0 0.500000 0.500000 0 0 0
( 2272 -344 -1248 ) ( 2104 -344 -1248 ) ( 2104 -344 -1264 ) common/caulk 0 0 0 0.500000 0.500000 0 0 0
( 2304 -360 -1248 ) ( 2304 -344 -1248 ) ( 2304 -344 -1264 ) common/caulk 16 0 0 0.500000 0.500000 0 0 0
( 2104 -360 -1248 ) ( 2272 -360 -1248 ) ( 2272 -360 -1264 ) karacrazy/marbre 0 0 0 0.500000 0.500000 0 0 0
( 2104 -360 -1248 ) ( 2104 -344 -1248 ) ( 2272 -344 -1248 ) karacrazy/marbre 0 -80 0 0.500000 0.500000 0 0 0
( 2272 -344 -1264 ) ( 2104 -344 -1264 ) ( 2104 -360 -1264 ) common/caulk 0 -16 0 0.500000 0.500000 0 0 0 }

// brush 1
{
( 2296 72 -1248 ) ( 2128 72 -1248 ) ( 2128 56 -1248 ) common/caulk 32 -16 0 0.500000 0.500000 0 0 0
( 2128 56 -1232 ) ( 2128 72 -1232 ) ( 2296 72 -1232 ) karacrazy/marbre 0 -80 0 0.500000 0.500000 0 0 0
( 2120 56 -1232 ) ( 2288 56 -1232 ) ( 2288 56 -1248 ) common/caulk 32 -32 0 0.500000 0.500000 0 0 0
( 2312 48 -1232 ) ( 2312 64 -1232 ) ( 2312 64 -1248 ) common/caulk 16 -32 0 0.500000 0.500000 0 0 0
( 2288 72 -1232 ) ( 2120 72 -1232 ) ( 2120 72 -1248 ) karacrazy/marbre 0 0 0 0.500000 0.500000 0 0 0
( 2120 72 -1232 ) ( 2120 56 -1232 ) ( 2120 56 -1248 ) common/caulk 16 -32 0 0.500000 0.500000 0 0 0 }

...

Waouh ! Maintenant que vous avez lut ces quelques lignes, vous vous dites que vous n'êtes pas sortie de l'auberge !!! Pas de panique.

Juste pour expliquer que cette ligne renferme la taille, la position, la rotation, la texture...bref toutes les infos associées à chaque face qui composent le bush.
Et c'est comme ça pour tous les brushs !

Et c'est ce qu'il faut garder à l'esprit dans ce tutorial; c'est que les brushs ne sont que des ensemble de faces !

"Leaf-node" et "Portal"
 

  • BSP : Comment se compile une map ?
Le premier travail du BSP et de "casser" cette map en pièces de plus en plus petites qu'on appelle "leaf nodes". Nous prendrons pour exemple cette ensemble de pièces ( image à droite )

Une "leaf node" et tout simplement un espace ne contenant pas de brushs "structural"

Map de base
BSP Tree Ci-contre, la structure de l'arbre BSP (BSP tree) , 
le premier cercle représente le noeud principal (head node) , 
lequel a 2 enfants, lesquels ont chacun 2 autres enfants,
etc.., etc..

Techniquement, le processus BSP prend le permier brush que vous avez crée et prend une des faces de ce brush. Il crée alors un plan partant de cette face et allant dans toutes les directions jusqu'à rencontrer un autre brush "structural".

Le processus BSP prend les faces traversant le plus de brushs et compose le BSP tree.

Le processus se répète pour chaque noeud enfant, jusqu'à ce qu'ils ne contiennent plus aucune face.

Chaque point est aussi appellé "leaf nodes" . Les plans qui sont des frontières entre deux noeuds désignés sous le nom des "portals", et sont importants pour le processus "VIS".
 

 

 

Dans notre exemple, le découpage a créé 4 "leaf nodes". Un pour chaque pièce et 2 dans le couloir (différenciés par chaque couleurs)

Les lignes noires représentent les "portals", c'est à dire l'endroit où se rencontre 2 "leaf nodes".

Portals

 

 

Maintenant si nous rajoutons des objets dans la première pièce comme un bureau, un casier, un meuble et une lampe (les 4 objets en rouge sur le schéma), étudions le découpage effectué par le processus BSP.

Structural

 
 
Donc comme précédemment chaque ligne noire délimite une "leaf-node". J'ai gardé les contours en rouge pour bien repérer les objets.

Et là vous vous dites "Mais c'est quoi ce foutu bordel ?"

Et oui il y a au moins 25 "leaf nodes" dans cette pièce car rappellez vous qu'il ne peut pas il y avoir de brushs "structural" dans une "leaf node".

Ainsi le processus BSP a crée une multitude de "leaf node" pour contourner tous les brushs (le casier, le bureau, la lampe...)

prt view
  • Le "VIS" n'est pas un pêché
Intervient alors le processus "VIS". Son rôle est de déterminer exactement ce que voit chaque "leaf node" entre elles et créé une table de correspondance utilisée par le moteur graphique.
 
Dans notre exemple nous avons 4 "leaf node".

Imaginons que le joueur se trouve dans la "leaf node" 4 : qu'elles autres "leaf node" voit-il ?
Les"leaf node" 3 et 2.

Comment le processus "VIS" détermine cela ?
Il trace des "lignes de vues" entre chaque portal et partant dans toutes les directions.
Si une ligne touche un autre "portal" alors chaque "leaf node" touchant ce portal est considérée comme étant visible de la "leaf node" de départ.

VIS
Table VIS
Le "VIS" construit une liste ou il indique ce que voit chaque "leaf node"
Cela pourrait ressembler à ce tableau:

En utilisant notre exemple nous pouvons déterminer que 

Quand je suis dans la "leaf node" 1 je vois les "leaf nodes" 2 et 3
Quand je suis dans la "leaf node" 2 je vois les "leaf nodes" 1 et 3 et 4
Quand je suis dans la "leaf node" 3 je vois les "leaf nodes" 1 et 2 et 4
Quand je suis dans la "leaf node" 4 je vois les "leaf nodes" 2 et 3

 


 
Revenons donc à notre première pièce composée de nombreuses "leaf node" et imaginez le travail du processus "VIS" qui va appliquer à chaque "leaf node" la procédure expliquée plus haut !

Plus la structure est complexe, plus la table sera complexe !

Mais alors que faire ?

Quelle solution ?

prt view

Voila qu'arrive le brush "detail".

Le brush "detail" est comme un brush classique que vous créez avec la petite particularité de ne pas causer de découpage durant le processus BSP et de ne pas bloquer "les lignes de vue" du processus "VIS". En fait, les brushs " detail " sont considérés comme invisibles par le processus VIS.

Pour passer un brush en "detail", vous devez simplement le sélectionner et faire CTRL+M ou choisir "Selection" "Make Detail"
 
 

Appliquons cela à notre pièce et relançons la compilation.

Bingo ! La première pièce est considérée comme une seule "leaf node"

On a réduit le nombre de "leaf node" à 1 en supprimant les "leaf nodes" inutiles.

Detail

Donc vous vous dites : "et si je passais tous les brushs en "detail" ? "

Non, il y a des situations précises pour l'utilisation des brushs "detail".

Les brushs "detail" ne peuvent avoir le côté extérieur dans le "vide".
Et c'est parfatiement logique si vous avez compris ce que j'ai mentionné plus haut que les brushs "detail" ne bloquent pas les "lignes de vue" du processus VIS.
Si vous avez un brush "detail" sur un mur extérieur, quand le processus VIS va intervenir, votre map sera "leaked" car il sera impossible pour le moteur de calculer sur un espace alors infini !
Par défaut tous les brushs donnant sur l'extérieur doivent rester "structural".

En général pour déterminer le type de brush à utiliser, on peut dire que tous les brush "structural" concernant la structure de votre map :

  • les fondations,
  • les murs,
  • les sols des pièces,
  • le ciel...

Les brush "detail" concernent tout ce qui composent l'intérieur de vos maps :

  • objets,
  • déco,
  • peintures sur les murs...
  • terrain....car complexe...

Cela permet au processus VIS d'être plus rapide et efficace.
A savoir aussi qu'une map trop peu équipée de brushs Structural sera injouable car tueuse de FPS ! Et oui, si le nombre de portal est trop faible, une trop grande quantité de polygones seront affichés en même temps, imposant alors un gros effort au PC.

"Hint brush"
  • Exemple 1 : le couloir
Ci dessous vous voyez un couloir avec un angle à 90° et 2 caisses au bout ce celui-ci.
Le rectangle rouge représente le joueur et la direction dans la laquelle il regarde.
 

Vue dans GTK Radiant

cliquez pour agrandir

Cliquez pour agrandir l'image

Vue dans ET avec /r_showtris 2

cliquez pour agrandir

Cliquez pour agrandir l'image


La ligne bleue montre le "portal" créé lors de la compilation.

Dans la vue de droite, tirée du jeu, on s'aperçoit que le moteur graphique affiche les brushs se trouvant dans le champ de vision du joueur mais aussi les caisses pourtant hors de portée de notre oeil humain.

Pour ce qui se trouve autour du joueur cela paraît un peu normal mais pour ce qui se cache dans l'angle formé par le portal et la direction de la vision du joueur, on peut imaginer les faces inutiles affichées par le moteur graphique et donc le gaspillage de FPS.
 

Vue dans GTK Radiant


cliquez pour agrandir

Cliquez pour agrandir l'image

Vue dans ET avec /r_showtris 2

 

cliquez pour agrandir

Cliquez pour agrandir l'image

On introduit un angle de partage en placant un "hint brush". ( c'est un brush classique auquel on applique la texture common/hint )
Maintenant, quand on se trouve à la place du joueur, le moteur graphique n'affiche plus les caisses et tout ce qui se trouve dans la zone délimitée en rouge sur le screen de gauche !
Notez que la diagonale bleue représente 2 "portal" chacun se terminant à l'intersection avec l'autre portal.

 

Cliquez pour agrandir l'image

 

 

Si le joueur se déplace un peu, les caisses apparaissent ! Bingo, voila un bon plan pour gagner quelques FPS avec des "hint brush" bien placés.

  • Exemple 2 : un étage
Dans cet exemple, j'ai créé un couloir menant à une échelle permettant d'accéder à un étage.
A chaque étage se trouvent des lits superposés
 

Vue dans GTK Radiant


cliquez pour agrandir

Cliquez pour agrandir l'image

Vue dans ET avec /r_showtris 2

 

cliquez pour agrandir

Cliquez pour agrandir l'image

Dans cet exemple, on s'apercoit que le moteur graphique affiche même se qui se trouve à l'étage alors que le joueur se trouve au rez-de-chaussé.

Allez hop, je créé 2 brushs avec la texture hint que je place comme suit :
 

Vue dans GTK Radiant


cliquez pour agrandir

Cliquez pour agrandir l'image

Vue dans ET avec /r_showtris 2


cliquez pour agrandir

Cliquez pour agrandir l'image

 

Après compilation, on peut voir que cette fois que lorsque le joueur est en bas, le moteur n'affiche pas ce qui se trouve à l'étage !

Complément d'aide

Pour vous aider à savoir si vos brush sont en "detail" ou "structural" dans GTK Radiant, il y a un plugin qui s'appelle "prtview".

Pour l'utiliser c'est très simple : compiler votre map en "BSP -meta".

A la fin de la compilation allez dans le menu "Plugins" et choisissez "prtview" "load .prt file"
Une fenêtre de sélection apparaîtra avec le nom du chemin complet du ficiher .prt (ex "D:/Program Files/Wolfenstein - Enemy Territory/etmain/maps/rtcv.prt")
Cochez la vue (show 2d ou/et show 3d) dans laquelle vous voulez faire apparaitre les infos et cliquez sur "OK"

En retournant dans le menu "plugins / prtview" vous pouvez annuler la vue en faisant "unload .prt file" ou "toggle portals (3D)"
Pour modifier les options d'affichage, "plugins / prtview / configure portal viewer"

Et voila en 3 screen la différence entre les brushs "structural" et les brushs "detail"
 
 

 

 

Voici ma map en construction ! Une pièce tout classique avec sa cheminée, sa table et des chaises entourées d'un brush "clip_weapon".
 

 

 

Après passage de la compilation "BSP -meta", j'affiche le prtfile.

Tous les brushs par défaut étant en "structural", on s'aperçoit bien de toutes les "leaf nodes" créées (les polygones de couleurs délimitées par les traits jaunes)
 
 

Je passe tous les brushs de la pièces en "detail" et je relance la compilation "BSP -meta"

J'affiche le prtfile et là on voit bien la différence.

Les "leaf nodes"  se limitent maintenant aux murs et au plafond qui n'ont pas été pasé en detail.

Avec un peu de pratique et beaucoup de patience et de test, on arrive facilement à trouver les bons endroits pour placer ses brushs "hint" et à transformer ces brushs "structural" en "detail".
 

Karapahuu - 2005

 

Crédits :

Source :

Splashdamage

Marko at home

Nib's world

Screenshots :

Leaf et Portal : Nib' World plus modifications de Karapahuu
Karapahuu pour le BSP Tree et le tableau VIS

Hint brush : Karapahuu
 
 
 

cR4ZyB3n® 1998-2005


 
 
 

Administré par cR4ZyB3n © 1998-2006 sur une base de XOOPS Modifications par cR4ZyB3n
Testé sur IE6 & Mozilla 1.6, optimisé pour une résolution de 1024*768