Last updated: 06/10/2024, 02:17

Current Project: Rejuvenation of Hellkeeper.net

É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.

Light dans le menu contextuel

Ses dérivés sont accessibles dans l'actor browser sous la Light elle-même.

Light et ses dérivés dans l'actor browser

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.

Propriétés de couleur de la lumière

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.

Nuancier

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.

Nuancier avec correspondance des paramètres

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.

Propriétés, onglet Lighting Lumière statique et lumière dynamique

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 :

Lors du rebuild, l'éditeur avertit qu'il s'agit d'effets obsolètes.

Avertissement de l'éditeur pour les LightEffects 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 :

Enfin, les effets suivants marchent car ils ne sont pas animés :

LE_Shell

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).

Rebuild de l'éclairage

Dans la fenêtre des paramètres du rebuild, on peut même demander un export des lightmaps lors du build.

Option d'export des lightmaps

Cela produit un fichier nommé LM-.bmp dans le dossier \System\ d'UT2004. Voici par exemple le lightmap de DOM-Watched, une fois exporté.

Lightmap de DOM-Watched exporté après rebuild

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.

Ombres d'une texture avec parties transparentes

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.

Choix de la finesse des lightmaps

Plus la valeur choisie est basse, plus les ombres seront détaillées.

Détails des lightmaps suivant leur résolution

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.

Illumination d'un triangle de static-mesh

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é.

Lightmap ajusté à un static-mesh

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.

Example de corona sur une lumière

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 :

Deux coronas similaires avec une taille maximale différente

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°.

Corona directionnelle vue depuis plusieurs angles

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.

Coronas identiques avec couleurs différentes

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.

Cônes de lumière avec angles différents

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.

Trigger et TriggerLight liés

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.

Propriétés spécifiques d'une TriggerLight

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.

InitialStates d'une TriggerLight

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.

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.

Différence d'éclairage entre un static-mesh et le BSP avec l'éclairage ambiant

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.

Résultat après application d'un ScaleGlow

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.

Lumière émise depuis le pivot d'un static-mesh

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.

© 2005-2026, by Hellkeeper.

Valid XHTML 1.1 & CSS 3