Brouillard
Le brouillard (généralement désigne de son nom anglais fog) est un paramètre de la ZoneInfo et du PhysicsVolume qui recouvre chaque point de l'écran d'un voile de couleur plus ou moins opaque suivant sa distance par rapport à la caméra. Le brouillard se définit dans ses grandes lignes par trois éléments : sa couleur, son rayon minimal et son rayon maximal.
Tout point de l'image dans la ligne de vue du joueur sera affiché normalement s'il se trouve en-deçà du rayon minimal du brouillard. Tout point situé au-delà du rayon maximal sera entièrement recouvert par le brouillard et un objet entièrement caché par le brouillard ne sera pas affiché. Entre les deux, la scène se fond progressivement dans le brouillard.
Le brouillard s'utilise à la fois comme effet visuel, car il permet de donner un effet de profondeur et de donner une teinte générale à une scène, et comme technique d'optimisation, car il permet de limiter l'affichage des objets dans un rayon limité autour du joueur et d'empêcher le calcul d'objets distants dans les très longues perspectives. Lorsqu'une map comprend un très vaste terrain en extérieur avec des reliefs peu accentués, il peut s'agir de la seule optimisation possible.
Brouillard de zone
Le brouillard est en général généré par une ZoneInfo. Deux ensembles de paramètres entrent en jeu : dans l'onglet ZoneInfo des propriétés de l'actor, bClearToFogColor et bDistanceFog permettent de paramétrer la présence ou l'absence de brouillard, et dans ZoneLight, une série de paramètres permet de régler son comportement.
Le paramètre bDistanceFog, lorsqu'il est réglé sur vrai, active le brouillard dans la zone sous contrôle de la ZoneInfo. L'effet est activé immédiatement dans le viewport 3D si la ZoneInfo a été correctement attribuée à la zone, c'est-à-dire si au moins un rebuild de la géométrie a été effectué après l'ajout de la ZoneInfo. Si le brouillard n'apparaît pas après que vous ayez paramétré bDistanceFog = vrai, commencez donc par un rebuild. Par ailleurs, le brouillard gris par défaut a une très longue distance d'affichage (3000-8000), il faudra sans doute le rapprocher pour le voir. Sur l'image suivante, les valeurs de départ et de fin ont été divisées par 10 (300-800).
Le brouillard a un effet d'occlusion : tout static-mesh ou polygone entièrement masqué par le brouillard n'est pas affiché. Si bClearToFogColor = faux, le BSP non affiché laissera apparaître un hall of mirrors. Si bClearToFogColor = vrai, le joueur verra à la place la couleur du brouillard. L'effet de ce paramètre n'est pas visible dans l'éditeur où l'occlusion affiche toujours le vide noire autour de la map et non pas la couleur du brouillard.
Si une skybox est présente dans la map et visible en même temps qu'un hall of mirrors, ce dernier affichera, à la place, le ciel. Régler ce paramètre sur vrai est donc surtout important dans les maps dépourvues de skybox ou dans les zones d'une map où une éventuelle skybox est impossible à voir.
Une fois le brouillard activé, il faut aller dans l'onglet ZoneLight pour le configurer.
- DistanceFogBlendTime règle la durée de la transition du brouillard. Lorsque le joueur passe d'une zone à une autre, les paramètres de brouillard des deux ZoneInfos concernées peuvent être différents. Afin d'éviter un changement brutal de couleur ou de distance du brouillard, celui-ci fait une transition progressive d'un état à un autre. Cette transition s'étend sur le temps (en secondes) spécifié par ce champ. C'est le DistanceFogBlendTime de la zone dans laquelle le joueur entre qui est pris en compte.
- DistanceFogColor permet de choisir la couleur du brouillard. Le champ A (pour alpha) n'a pas d'impact.
- DistanceFogEnd indique à quelle distance du joueur le brouillard se termine. Tout static-mesh ou polygone entièrement situé au-delà de cette limite ne sera pas affiché.
- DistanceFogEndMin permet d'ajouter une seconde limite de fin au brouillard. Si ce champ est rempli, la distance de fin du brouillard n'est pas une donnée fixe mais un intervalle entre cette distance et celle entrée dans DistanceFogEnd. Il est alors possible d'utiliser le réglage "Distance brouillard" dans les options du jeu pour déterminer à quel niveau de cet intervalle le brouillard s'arrête. Un brouillard se terminant plus proche du joueur cache plus de choses et permet donc d'améliorer les performances au prix d'une ligne de vue moins longue. Si DistanceFogEnd est paramétré mais que DistanceFogEndMin = 0, le slider des options n'a aucun effet.
- DistanceFogStart détermine à quelle distance du joueur le brouillard commence à recouvrir la map. Toute partie en-deçà de cette limite sera affichée normalement.
Notez que si le joueur passe dans une zone sans brouillard, celui-ci disparaît instantanément. S'il entre dans une zone avec brouillard, celui-ci apparaît bien d'un coup, mais seulement au bout du temps indiqué par DistanceFogBlendTime (le délai est bien pris en compte mais il n'y a pas de transition progressive).
Il est aussi possible de mettre une valeur plus basse dans DistanceFogEnd que dans DistanceFogStart. Le joueur sera alors entouré d'un halo de couleur qui s'amenuisera avec la distance. Cependant, toute la map sera au-delà de la limite maximale. Seuls les polygones extrêmement proches du joueur seront donc affichés.
Le brouillard d'une ZoneInfo s'affiche dans l'éditeur, ce qui permet de se rendre compte de l'effet final. De plus, parce qu'il est possible de désactiver la skybox dans l'éditeur, la limite d'affichage est facilement visible, même sur les terrains de grande taille.
Brouillard de volume
Le brouillard peut également être ajouté dans un volume. Il doit s'agir d'un PhysicsVolume ou d'un de ses dérivés (LavaVolume, WaterVolume, etc.) car seules ces classes possèdent les propriétés nécessaires à sa configuration.
Ces paramètres sont les mêmes que leurs homonymes dans une ZoneInfo.
Le brouillard généré par un volume n'a pas toutes les fonctions de celui d'une ZoneInfo : il n'a pas d'effet d'occlusion et ne peut donc pas servir à optimiser la map : les static-meshes et le BSP au-delà de la limite seront calculés même s'ils sont entièrement cachés. Il sert surtout d'effet d'ambiance. Le WaterVolume a ainsi un brouillard bleu épais configuré par défaut. Il n'y a pas de transition pour ce type de brouillard : il apparaît ou disparaît instantanément à l'entrée ou à la sortie du volume.
Si deux volumes ou plus comprenant du brouillard se chevauchent, c'est le volume qui vient en dernier dans l'ordre qui aura la priorité dans la zone de chevauchement. Dans tous les cas, le brouillard d'un volume a également la priorité sur celui d'une ZoneInfo. De plus, l'affichage du brouillard des volumes dans l'éditeur ne fonctionne pas correctement. Par défaut, il n'est pas visible dans UnrealEd et ne fonctionne qu'en jeu. Cependant, si une ZoneInfo avec brouillard se trouve dans la zone où a été placé le volume, le brouillard de toute la zone est remplacé par celui du volume (ou du dernier volume ajouté) dans l'éditeur. Cela n'a pas d'incidence en jeu, où le brouillard de la ZoneInfo sera activé dans les parties normales de la zone et remplacé à l'intérieur de chaque volume par le brouillard spécifique de celui-ci.
Interaction avec une skybox
En général, un seul brouillard est affiché à la fois. Il existe cependant une exception dans la skybox.
Il est possible d'ajouter un brouillard à la SkyZoneInfo qui s'applique donc dans la skybox elle-même. Si un joueur se trouve dans une zone avec un brouillard déjà configuré mais qu'il voit la skybox à travers un Fake Backdrop, le brouillard de la zone où il se trouve s'applique à la map autour de lui, mais le brouillard de la skybox s'applique au contenu de la skybox.
Ici, le terrain enneigé est couvert d'un brouillard orange alors qu'un brouillard bleu ciel est visible dans la skybox.
Si la map est assez vaste pour que les objets lointains se trouvent au-delà de la limite du brouillard et que l'horizon donne sur la skybox, ces objets peuvent apparaître et disparaître brutalement au loin quand le joueur se déplace, comme dans un vieux jeu de PlayStation ou Nintendo 64. Cela affecte également les secteurs d'un terrain qui se trouvent au-delà de la limite, le paysage devenant alors invisible par carrés successifs.
Pour masquer cette limite, il est nécessaire que l'horizon lointain soit occupé par la même couleur que le brouillard. Si ce n'est pas le cas dans les textures de la skybox elle-même, on peut obtenir cela en ajoutant dans la skybox, autour de la SkyZoneInfo, un fogring, un static-mesh en forme d'anneau portant une texture de la couleur du brouillard qui devient transparente en son sommet. On voit ici la différence avec un horizon sans forging à gauche et avec fogring mis en évidence à droite.
Un tel fogring existe dans plusieurs packages d'UT2003 et 2004, notamment fogring1 dans le package CP_Nightmare1_Epic.
Il est possible d'en changer facilement la couleur en dupliquant son shader (H_E_L_Ltx.skys.cp_alphafogging1shad) dans votre package ou dans MyLevel. Ce shader contient un masque d'opacité responsable de la transparence au sommet du fogring, et une texture monochrome qui définit la couleur du fogring. Cette dernière peut-être remplacée par une autre texture importée, de n'importe quelle couleur. Il est aussi possible de générer un shader ConstantColor. Celui-ci n'aura pas de dimensions mais seulement une donnée de couleur. Il peut malgré tout être ajouté au Diffuse du shader du fogring. L'idée est de donner au fogring la même couleur que le brouillard de la map.
Lorsqu'un static-mesh ou un polygone BSP est totalement caché par le brouillard, il est supprimé et laisse apparaître derrière lui le fogring. Si la couleur est la même, l'effet est invisible tant que static-meshes ou BSP ne dépassent pas le fogring en hauteur.
En combinant le brouillard dans la map, dans la skybox et un fogring entre les deux, comme dans l'image de BR-Riveting ci-dessus, on obtient un horizon brumeux qui masque la limite d'affichage de la map au loin tout en servant de transition avec la skybox, elle-même pourvue d'un brouillard qui accentue l'effet de profondeur des paysages lointains.