Éclairage
Tous les actors d'Unreal sont capables d'émettre de la lumière s'ils sont paramétrés correctement pour, mais une série d'actors spécifiques, la Light et ses dérivés, sont explicitement prévus pour remplir ce rôle. Ils projettent la lumière depuis leur position et peuvent être positionnés très précisément (ils ne sont pas attachés à la grille de l'éditeur). L'éclairage d'UT2004, contrairement à Unreal et UT99, est par défaut statique : les lumières ne peuvent pas être animées ou se déplacer, sauf cas spécifiques.
Light
L'actor Light est la base de l'éclairage d'une map. La Light projette un cercle de lumière autour d'elle dont on peut ajuster le rayon et la couleur. Une map peut en contenir autant que nécessaire, même si l'éditeur avertit d'un impact négatif sur les performances au-delà de 1500 Lights dans une même map. La Light de base se trouve dans le menu contextuel qui s'ouvre lors d'un clic droit dans une vue de l'éditeur.
Ses dérivés sont accessibles dans l'actor browser sous la Light elle-même.
L'actor xDomAlert n'est pas terminé et il n'a aucune particularité par rapport à la TriggerLight normale, dont le fonctionnement est expliqué plus bas.
Couleur et rayon
Par défaut, l'actor Light projette une lumière blanche. La couleur peut s'ajuster dans l'onglet LightColor de ses propriétés à l'aide de 3 valeurs réglables de 0 à 255.
LightBrightness est la puissance de la lumière. Plus la valeur est élevée, plus les objets situés dans son rayon d'action reçoivent un éclairage intense.
LightHue et LightSaturation définissent la couleur de la Light. Par défaut, la Hue est 0, ce qui équivaut à un rouge profond, mais la lumière est blanche car la Saturation est de 255. En effet, plus la Saturation est basse, plus la couleur est pure, et plus elle est haute, plus la couleur tire vers le blanc.
La teinte, définie par LightHue, est un spectre. Au fur et à mesure que la valeur augmente, la teinte change de rouge à jaune, puis vert, cyan, bleu et violet avant de revenir au rouge.
Lorsque l'onglet LightColor est ouvert, deux boutons s'affichent : "Ramas." permet de cliquer dans le viewport 3D pour extraire la couleur d'un pixel de l'écran et la donner à la Light. "Coul." permet d'ouvrir la fenêtre de choix de couleur de Windows qui donne accès à un nuancier, plus pratique pour choisir une couleur précise que de tâtonner avec les paramètres chiffrés.
Déplacer la croix sur le nuancier permet de choisir précisément la couleur souhaitée. Cela revient théoriquement à modifier les paramètres équivalents de LightColor.
En réalité, cependant, la couleur choisie ne sera pas convertie telle quelle avec LightHue = Teinte, LightBrightness = Lum. et LightSaturation = Satur. mais l'éditeur convertira à peu près la teinte voulue dans ses propres paramètres. La couleur résultante a tendance à être très délavée par rapport au nuancier (LightBrightness et LightSaturation très élevées).
Les autres paramètres de la Light se trouvent dans l'onglet Lighting. Le plus important est LightRadius qui définit le rayon du cercle de lumière autour de l'actor. Il s'agit d'une valeur abstraite qui ne correspond pas à des mesures réelles dans l'éditeur (un rayon de 12 suffit à éclairer l'intérieur d'un cube de 256 unités de côté).
Paramètres avancés
Parmi les autres paramètres de l'onglet Lighting, 3 n'ont aucun effet : bActorShadows, bAttenByLife et bLightingVisibility.
- bDynamicLight : Permet de rendre la Light dynamique. Elle ne projette alors aucune ombre et sa lumière passe à travers les obstacles, ce qui limite fortement son utilisation si l'on veut garder des ombres et un éclairage réaliste, mais elle peut alors être déplacée et recevoir un effet.
- bSpecialLit : Toute Light ayant ce paramètre réglé sur vrai ne projette sa lumière que sur les actors ayant également ce paramètre vrai et les polygones BSP ayant le paramètre Special Lit activé dans leurs propriétés de surface.
- bLightCone : Définit un cône de lumière pour une Spotlight (détaillée plus bas). LightEffect doit être LE_Spotlight ou LE_StaticSpot pour que ce paramètre ait une influence.
Le paramètre suivant, LightEffect, est un reste des versions précédentes du moteur et se trouve être largement non fonctionnel. Par défaut, le LightEffect est LE_None, qui n'a aucun effet particulier.
Les LightEffects suivants ne fonctionnent pas :
- LE_TorchWaver
- LE_FireWaver
- LE_WateryShimmer
- LE_CloudCast
Lors du rebuild, l'éditeur avertit qu'il s'agit d'effets obsolètes.
Les effets suivants sont des effets animés qui semblent à première vue fonctionnels, mais leur animation se fige lors du rebuild de la map, une fois que les lightmaps ont été calculés :
- LE_Searchlight : Une section de cylindre en rotation autour de la Light.
- LE_SlowWave : Ronds alternés d'ombre et de lumière pulsant depuis la Light.
- LE_FastWave : Similaire à SlowWave mais bien plus rapide.
- LE_Shock : Pulsations lumineuses.
- LE_Disco : Effet particulièrement excentrique de boule disco en rotation.
- LE_Interference : Anneaux de lumière se déplaçant vers le haut.
- LE_Rotor : Projette la lumière comme s'il s'agissait de l'ombre d'un ventilateur.
Enfin, les effets suivants marchent car ils ne sont pas animés :
- LE_None : Effet par défaut, la lumière est fixe.
- LE_StaticSpot et LE_Spotlight : identiques, ils permettent de projeter un cône de lumière dans l'orientation de la Light. Celle-ci doit donc être orientée comme voulu, ce qui est plus facile si l'on règle bDirectional à vrai dans l'onglet Advanced de ses propriétés.
- LE_Sunlight : Lumière de portée infinie, utilisée par l'actor Sunlight. La lumière est émise par les surfaces en Fake Backdrop de la map en suivant l'orientation de la Light.
- LE_Wrap : Fonctionne mais ne semble pas avoir d'effet particulier. Similaire à LE_None.
- LE_NonIncidence et LE_QadraticNonIncidence : Fonctionnent comme l'effet par défaut (LE_None), mais la lumière perd brutalement son intensité à l'extrémité de son rayon au lieu de le faire progressivement au fur et à mesure que la distance augmente.
- LE_Shell : Au lieu d'éclairer la totalité du volume contenu dans le rayon de la lumière, cet effet éclaire seulement une fine frange à l'extrémité de la portée de la Light.
- LE_OmniBumpMap : Similaire à l'effet par défaut.
- LE_Cylinder : Projette la lumière dans un cylindre dont le rayon et la hauteur sont définis par le LightRadius au lieu de le faire dans une sphère. L'effet est beaucoup plus puissant, à rayon égal, qu'une Light classique.
- LE_Negative : Lumière noire : soustrait sa luminosité à la lumière ambiante.
Si l'on règle une Light normale en bDynamicLight = vrai, car cela a pour effet de rendre la Light totalement inopérante si elle a un LightEffect autre que LE_None, LE_NonIncidence ou LE_QuadraticNonIncidence, qui sont les seuls à fonctionner.
LightType contient quelques autres effets permettant à l'origine de faire clignoter la lumière. Avec LT_None et LT_Steady, la lumière est respectivement éteinte et allumée. Il s'agit des deux seuls états entièrement fonctionnels par défaut. Les autres LightTypes semblent fonctionner si la Light est réglée en bDynamicLight = vrai, car l'éditeur montre l'animation, mais celle-ci sera désactivée dans le jeu et la Light sera sans effet. Une exception cependant : les LightTypes fonctionnent avec les TriggerLights. Les différents effets seront donc expliqués dans la partie dédiée à cet actor, plus bas, ainsi que LightPeriod et LightPhase, qui permettent de paramétrer les LightTypes.
Lightmaps
On a vu que l'éclairage d'UT2004 est par défaut statique et que les lumières dynamiques ne projettent pas d'ombres. La cause en est que les ombres sont précalculées et ne peuvent donc pas changer en cours de jeu. Elles sont compilées sous forme de lightmaps, c'est-à-dire des textures recouvrant la totalité de la géométrie, sur lequelles sont imprimées les ombres et les lumières de la map. Pour simuler des ombres animées (ou extrêmement précises), il faut avoir recours à des Projectors.
On compile ces lightmaps en rebuildant l'éclairage (ou les parties de l'éclairage qui ont été changées depuis le dernier rebuild).
Dans la fenêtre des paramètres du rebuild, on peut même demander un export des lightmaps lors du build.
Cela produit un fichier nommé LM-.bmp dans le dossier \System\ d'UT2004. Voici par exemple le lightmap de DOM-Watched, une fois exporté.
Il n'y a en revanche aucun moyen d'importer un lightmap depuis l'extérieur pour l'utiliser dans la map.
Tous les objets ayant bShadowCast = vrai dans l'onglet Display de leurs propriétés peuvent projeter une ombre. Les surfaces de BSP ou de static-mesh portant une texture partiellement transparente projettent des ombres correspondant aux parties opaques. Ainsi, dans DM-Leviathan, des lumières se trouvent derrière un static-mesh portant une texture de grillage. L'ombre correspond à la texture.
Les lightmaps étant des textures, ils ont une résolution qui peut être plus ou moins importante. Plus la résolution augmente, plus les ombres sont fines. Cette finesse se règle dans les paramètres des surfaces BSP. Chaque surface peut avoir son propre paramètre de résolution de lightmap.
Plus la valeur choisie est basse, plus les ombres seront détaillées.
Néanmoins, à réglage similaire, une surface plus petite aura des lightmaps plus fins qu'une surface plus étendue. Suivant sa taille, chaque surface se voit en effet attribuer une partie de lightmap plus ou moins grande. Le réglage dans la fenêtre des propriétés de surface agit comme un multiplicateur, pas comme une taille absolue.
Hors des surfaces BSP, les joueurs, static-meshes et terrains sont éclairés par un système totalement différent et très simplifié qui interdit les ombres détaillées. Chacun de ces objets est divisé en triangles et, pour chaque triangle, la lumière est calculée au niveau des trois sommets du polygone, puis un dégradé est réalisé entre chaque point.
Pour avoir des ombres aussi détaillées que des lightmaps de BSP sur des static-meshes, il faut donc soit utiliser une texture ajustée au static-mesh avec les ombres prédessinées, ou utiliser un lightmap précalculé ajouté au static-mesh. On peut le voir sur l'image suivante, où les deux static-meshes sont identiques et dépourvus d'éclairage, mais l'un des deux a reçu un lightmap préfabriqué.
Pour les terrains, il est possible d'ajouter un "vertex lightmap" à une TerrainInfo, mais chaque point de la texture importée donne alors sa couleur à un triangle correspondant du terrain. Les ombres détaillées sont donc impossibles sur le terrain hors Projector.
Corona
Une corona est un halo de lumière qui apparaît autour d'une source lumineuse. Il fait toujours face au joueur quelle que soit sa position et sa taille ne change pas sur l'écran, ce qui donne l'impression qu'il grandit lorsqu'on s'éloigne de la source et qu'il rapetisse lorsqu'on s'en rapproche.
La corona est toujours affichée en entier tant que le point précis dont elle est émise (la position de l'actor Light) est visible. Elle ne peut donc pas être partiellement cachée par un mur ou un obstacle (comme on le voit avec le rayon bleu sur l'image ci-dessus, qui s'affiche par-dessus le mur courbe sur la droite). Combiné avec le fait qu'elle ne disparaît pas instantanément, lorsqu'elle se retrouve totalement masquée, mais disparaît progressivement sur une durée d'environ une seconde, son usage permet donc de simuler un éclairage éblouissant avec un effet de rémanence. Ces effets ne peuvent pas être simulés avec un simple sprite créé par un Emitter.
Le paramètre bCorona permet d'activer l'effet si une image de halo est ajoutée dans le champ Skins de l'onglet Display des propriétés de la Light. Il faut toutefois que l'éclairage ait été rebuildé au moins une fois pour que l'effet devienne visible.
L'onglet Corona des propriétés de la Light contient des paramètres réglant le comportement de la corona :
- CoronaRotation : Permet de faire tourner la corona sur elle-même lorsque le joueur s'approche ou s'éloigne de la source lumineuse. Elle reste fixe si ce champ est à 0.
- CoronaRotationOffset : Permet de faire pivoter une corona. Il s'agit d'un angle en unités Unreal (de 0 à 65536).
- MaxCoronaSize et MinCoronaSize : Permettent de régler la taille maximale et minimale du halo. Cela permet d'empêcher la corona d'avoir une apparence gigantesque à grande distance ou invisible lorsque l'utilisateur se trouve très proche de la Light.
- UseOwnFinalBlend : Non fonctionnel. Si réglé sur vrai, la corona ne s'affiche plus.
Un dernier paramètre est bDirectionalCorona, dans l'onglet Lighting. Il permet de rendre la Corona visible uniquement dans la direction que la Light "regarde" (qui peut-être affichée en réglant bDirectional = vrai dans l'onglet Advanced). La corona s'affiche alors en pleine taille lorsque l'on regarde la Light en direction de sa flèche. Elle rapetisse au fur et à mesure que l'on dévie de cet angle et disparaît totalement si l'on dépasse les 90°.
Dans tous les cas, la corona disparaît lorsque le joueur sort du LightRadius de la Light qui l'émet, elle n'est pas visible à l'infini. On peut utiliser un radius poussé au maximum, "255", pour que l'effet soit visible à très longue distance. La corona sera alors visible jusqu'à environ 6300 unités de distance. Il est courant d'utiliser une Light avec une corona et un très long rayon mais une LightBrightness de 0, afin qu'elle n'éclaire pas la map mais projette le halo, et une Light classique responsable de l'éclairage lui-même.
Enfin, la corona est affectée par la couleur de la Light, ce qui permet d'utiliser une texture neutre et de la colorer en fonction de la lumière.
Spotlight et Sunlight
La Spotlight est une Light normale avec le LightEffect LE_Spotlight et bDirectional = vrai. Elle projette la lumière non pas en sphère autour d'elle-même mais dans un cône centré sur sa flèche directionnelle. L'angle de ce cône est réglé de 0 à 255 par le paramètre LightCone, 255 étant presque équivalent à 90° de chaque côté. Plus la valeur est faible, plus le cône sera fin. La portée maximale de la lampe est toujours liée au LightRadius.
On peut changer le LightEffect pour n'importe quel autre effet fonctionnel et l'utiliser comme une Light normale, auquel cas la flèche directionnelle devient inutile.
La Sunlight est une lumière directionnelle de portée infinie qui ne projette pas sa lumière elle-même. L'éclairage de la Sunlight est calculé depuis les surfaces en Fake Backdrop de la map afin de simuler l'éclairage du soleil. L'explication détaillée de ce fonctionnement est donnée dans le tutorial sur les skyboxes.
Ces deux actors possèdent les mêmes paramètres, limitations et possibilités que la Light normale.
TriggerLight
La TriggerLight est une version modifié de la Light classique avec la particularité de pouvoir être déclenchée par un Trigger ou autre déclencheur. Il suffit que l'Event du Trigger corresponde à son Tag. On peut bien entendu la déclencher également avec le mouvement d'un mover, un événement scripté ou avec un autre type de Trigger comme le UseTrigger.
Afin de pouvoir s'allumer et s'éteindre, elle est par défaut dynamique et possède plusieurs InitialStates qui régissent la façon dont elle réagit à un déclencheur. Par rapport à une Light, deux de ses paramètres de base sont modifiés : bMovable = vrai et bDynamicLight = vrai. Comme toute lumière dynamique, elle ne projette pas d'ombre.
Par défaut, une TriggerLight est éteinte au début du jeu et s'allume instantanément une fois déclenchée. Ce comportement peut cependant s'ajuster dans l'onglet TriggerLight de ses propriétés. Cependant, dans l'éditeur, elle est toujours montrée comme allumée, ce qui permet de se rendre compte de son effet lorsqu'elle est en marche.
- bDelayFullOn : Indique si l'allumage est instantané ou progressif. Fonctionne en conjonction avec ChangeTime.
- bInitiallyOn : Si vrai, la lumière est allumée au début du jeu et la déclencher l'éteint. Par défaut, ce paramètre est faux et la lumière est éteinte jusqu'à être activée.
- ChangeTime : Temps (en secondes) mis par la lampe pour passer d'un état à l'autre. Si bDelayFullOn est faux, la transition est progressive. Si bDelayFullOn est vrai, le changement est instantané et ChangeTime indique le délai entre l'activation et l'allumage ou extinction.
- RemainOnTime : Ce paramètre est non fonctionnel. Il devrait marcher avec l'InitialState TriggerPound qui ne marche pas comme il devrait.
Si ces paramètres déterminent la façon dont la lumière s'allume et s'éteint lorsqu'elle a été déclenchée, l'onglet Object contient plusieurs InitialStates qui déterminent la façon dont la TriggerLight réagit aux Triggers.
- None : La TriggerLight ne réagit pas.
- TriggerPound : Non fonctionnel, fonctionne comme TriggerTurnsOn.
- TriggerControl : La lampe s'allume et reste allumée tant que le Trigger fonctionne. Dès que ce dernier n'est plus activé, la lampe s'éteint (ou l'inverse si bInitiallyOn = vrai).
- TriggerToggle : Chaque déclenchement change l'état de la lampe. Elle s'allume si elle est éteinte et s'éteint si elle est allumée.
- TriggerTurnsOff : La lampe s'éteint définitivement quand elle est déclenchée. Assurez-vous que bInitiallyOn = vrai, sinon la TriggerLight sera non fonctionnelle.
- TriggerTurnsOn : À l'inverse, allume définitivement la lampe si elle est éteinte (donc soyez sûrs que bInitiallyOn = faux).
Une corona peut être utilisée sur une TriggerLight, mais même si cette dernière est éteinte, la corona reste toujours visible. Notez que comme la TriggerLight est réglée en bMovable = vrai, elle peut être attachée à un objet mobile et se déplacer avec en emmenant sa corona avec elle. Mettez le Tag du mover dans l'AttachTag de la TriggerLight (onglet Movement) et elle suivra l'objet dans ses déplacements. Il sera toujours possible de l'allumer ou de l'éteindre avec un déclencheur.
À noter que la TriggerLight étant dynamique, les LightEffects ne fonctionnent pas dessus, comme expliqué plus haut, à l'exception de LE_None, LE_NonIncidence et LE_QuadraticNonIncidence. En revanche, les LightTypes qu'on peut lui donner fonctionnent, y compris dans le jeu, ce qui en fait l'unique moyen de les utiliser. Si l'on tient à utiliser un de ces effets sur une lumière fixe, une TriggerLight allumée par défaut et que rien ne peut éteindre peut être utilisée comme une Light dynamique normale.
- LT_None : Aucune lumière n'est émise.
- LT_Steady : La lumière est fixe une fois allumée.
- LT_Pulse et LT_SubtlePulse : Lente pulsation régulière de la lumière. Pulse permet de faire pulser entre éteint et pleinement allumé alors que SubtlePulse ne s'éteint jamais complètement.
- LT_Blink et LT_Flicker : Clignotement rapide et irrégulier. Blink permet d'avoir de nombreuses petites extinctions rapides alors que Flicker tend à avoir des périodes d'extinction plus longues et nombreuses.
- LT_Strobe : Clignotement très rapide et régulier.
- LT_BackdropLight et LT_FadeOut : Ne fonctionnent pas.
- LT_TexturePaletteOnce et LT_TexturePaletteLoop : Permettent d'utiliser une palette (une texture en 256 couleurs au format P8 dans l'éditeur). La lumière passera par toutes les couleurs de la palette avant de s'arrêter sur la dernière (PaletteOnce) ou de recommencer son cycle en boucle (PaletteLoop). La palette s'ajoute dans le champ Skins de l'onglet Display des propriétés de la TriggerLight. LT_TexturePaletteOnce est défectueux et n'utilise que la dernière couleur de la palette sans varier.
Ces LightTypes peuvent être légèrement ajustés avec les paramètres LightPeriod et LightPhase. Le premier permet de régler la vitesse de l'animation (par exemple la vitesse de pulsation avec LT_Pulse) en entrant un nombre entre 0 et 255 (plus le nombre est grand, plus la vitesse est lente). Le second permet de choisir à quel moment du cycle de l'animation la lumière commence lorsqu'elle est allumée par un Trigger (ou lorsque la partie commence si elle est allumée dès le départ). Là aussi, il s'agit d'un nombre entre 0 et 255, où 0 est le début et 255 la fin de l'animation (ou la première et la dernière couleur de la palette si vous utiliser LT_TexturePaletteLoop).
Éclairage de zone
Les ZoneInfos et leurs dérivés peuvent appliquer un éclairage global à tous les actors au moins partiellement compris dans la zone correspondante et à toutes les parties de la géométrie qui s'y trouvent. Cet éclairage se règle dans l'onglet ZoneLight des propriétés de la ZoneInfo. AmbientBrightness, AmbientHue et AmbientSaturation sont les équivalents des LightBrightness, LightHue et LightSaturation dans les paramètres d'une lumière classique. L'application d'un éclairage de zone permet d'éviter d'avoir des ombres totalement noires, par exemple.
Les static-meshes sont éclairés d'une manière spécifique et semblent donc plus clairs qu'ils ne devraient lorsqu'ils sont soumis à un éclairage de zone.
On ne peut donc pas se reposer sur ce seul éclairage global, mais les autres lumières qui viennent se rajouter à l'éclairage ambiant masquent au moins partiellement la différence. Si le contraste entre les static-meshes et la géométrie reste trop important, on peut utiliser le paramètre ScaleGlow qui agit comme un coefficient multiplicateur sur la quantité de lumière reçue d'autres sources lumineuses que la ZoneLight. Les parties du static-mesh qui ne reçoivent que l'éclairage de zone restent cependant très claires par rapport au BSP.
Autres actors
Les actors du type Light ne sont pas les seuls à pouvoir émettre de la lumière. En réalité, tout actor peut être paramétré pour devenir une source lumineuse en lui ajoutant un LightRadius et une LightBrightness supérieurs à 0, ainsi qu'un LightType fonctionnel. Cette lumière est alors émise depuis le pivot de l'actor et se comporte normalement. La corona reste aussi centrée sur le pivot. L'éclairage étant dépendant du placement précis de la source, cette contrainte suffit à justifier l'usage d'un actor spécifique qui peut être positionné précisément.
L'actor projette sa propre ombre s'il est paramétré pour. Si le pivot est dans le static-mesh, il est possible que la lumière ne puisse pas en sortir. Il faut alors déplacer le pivot en dehors de sa géométrie.
RSS Feed