Le vertex lighting
fonctionne à partir des nodes/vertex comme le nom l'indique.
Ce système calcule la quantité de lumière qui touche un
vertex depuis une source de lumière et donc éclaire ce vertex
en conséquence, lorsqu'il sait comment la lumière touche chacun des
trois sommets d'un triangle (tout est fait à partir de triangles),
il étalera la lumière sur la surface/poly entre chaque vertex.
Pour faire simple, si une node sur le coté gauche d'un cube
reçoit une lumiére de 240, en brightness, et que la face
droite reçoit une lumière de 0, alors la lumière entre les nodes
va s'étaler de 240 à 0.
Un exemple pour illustrer ceci :

Sur le triangle que
vous voyez ci-dessus, les trois points verts sont les nodes/coins/vertices
du triangle, les chiffres 1 et 2 sont les lumières. Les deux
vertices sur la gauche reçoivent beaucoup de lumiére mais pas ceux
sur la droite donc le moteur étale la lumiére d'un coté à l'autre..
Maintenant le problème potentiel avec ceci, si vous avez un long
objet, est s'il n'est pas tesselated (c.à.d. subdivisé en
plusieurs faces, plus à ce sujet un peu plus bas), il va rester
noir, comme sur l'exemple suivant :

Un long tube avec les
vertices à chaque extrémité et une lampe au milieu, mais la
lumiére de cette lampe ne va pas suffisamment loin pour toucher les
nodes à chaque extrémité, donc ce qu'il se produit sur la
surface, le milieu du tuyau, elle reste noire. Chaque extrémité ne
reçoit aucune lumiére donc celle-ci s'étale sur la surface de "rien"
à "rien" et la surface reste noire.
La même chose arrive lorsque chaque extrémité du tuyau se trouve
dans un autre static mesh ou un mur : la lumiére ne pourra
pas toucher les vertices.
Il est nécessaire de le subdiviser davantage, et d'autant plus qu'il
s'agit d'un gros static mesh, plus il y aura de vertices
et meilleur sera l'éclairage.

A gauche, il y a
peu de polygones et donc de bonnes chances que le problème mentionné
au-dessus se présente ; à droite, c'est mieux. Même si le cube
de droite a un coté à l'intérieur d'un mur, sa lumiére serait
toujours acceptable et seulement 15% du sol serait noir puisque il y
a toujours 3 surfaces pour rejoindre le coté opposé et seulement la
moitié d'une surface est noir. Si le cube de gauche a une face à
l'intérieur d'un mur, 50% du sol deviendrait noir. Et si vous avez
un objet sur votre sol, comme une caisse par exemple, il ne
projetterait absolument pas d'ombres si vous n'avez pas assez de
subdivisions.
Les meshes dans le U-Engine actuel utilisent le
vertex lighting, contrairement au BSP qui utilise le
lightmapping. Les lightmaps ne dépendent pas des
nodes, le moteur fait une image de la façon dont l'ombre se projette
sur un poly et sauvegarde cette image dans le fichier du map
et le résultat en est une ombre claire sur le sol (le niveau de
détails de ces ombres peut être paramétré au fait : plus bas est le
nombre, plus détaillées sont les ombres, plus lourd est le fichier
du map car plus grosse est la résolution des images et donc
plus les performances en sont affectées puisque la lumiére dynamique
des armes est en haut détail également, c'est le même principe que
le lightbaking pour les meshes).
Puisque les static meshes utilisent le vertex lighting,
ils ne peuvent recevoir d'ombres.

L'éclairage peut
toujours rejoindre les trois points et s'étaler comme il faut sur
l'ensemble de la surface. Le cube situé au-dessus ne peut
projeter d'ombre sur le triangle qui ne possède pas suffisamment de
vertices pour permettre au moteur d'interpréter l'éclairage
convenablement. Si ce cube était au-dessus d'un vertex,
comme sur l'image suivante, celui-ci ne recevrait pas de lumiére et
donc resterait noir, devenant une sorte d'ombre.

La plupart du temps
lorsque vous ferez vos propres meshes, vous pourrez
simplement placer les choses les unes au-dessus des autres et les
attacher plus tard. Cependant, si vous faites ceci avec un gros
static mesh et que vous souhaitez l'utiliser tel quel vous
finirez avec une situation comme celle-ci :

Avec une lumiére sur
un coté, vous pouvez constater que la lumiére passe sous le petit
cube du dessus, ce qui est horrible. Cela se produit pour la
bonne raison que l'éclairage touche également les quatre cotés du
gros cube donc le poly du dessus reçoit un dégradé correct. Le
moteur ne voit pas le petit cube du dessus de sorte que celui-ci ne
peut affecter le poly supérieur du gros cube. Pour réparer une
situation de ce genre, il vous faut faire des deux cubes un seul
et même objet, de sorte que tous les vertices soient connectés,
en découpant le poly supérieur du gros cube de la bonne façon puis
en plaçant le petit cube au-dessus et en soudant les vertices. Comme
ceci :

Maintenant, la lumiére
parait moins basique, il y a une ombre parce que le poly
supérieur du gros cube a des nodes supplémentaires au milieu.
Bien sur, vous n'êtes pas toujours obligés de faire ainsi et surtout
pas sur chaque minuscule détail puisque ça ferait un polycount
trop élevé. Faites comme ça lorsque vous pensez que c'est
nécessaire.
En général, vous devrez éviter de long polygones étirés et de gros
polygones également : la subdivision est votre ami. Cela
marche aussi dans un situation comme celle-ci :

Ici nous avons deux
meshes visuellement identiques et vous ne verrez pas la
différence si vous ne regardez pas l'image en fil-de-fer, c'est
aussi le même polycount. Le mesh du dessus n'est pas
correct, celui du dessous l'est.
Au-dessus, les polys sont très étirés, le vertex lighting
aura du mal à calculer une telle situation : il dégradera la lumiére
depuis la face de droite jusqu'au vertex en bas à gauche dans
un triangle très fin. Généralement, ça ne ressemble à rien.
Plus la forme du triangle sera simple et courte, le mieux ce sera.
L'idéal dans une situation comme celle-ci serait de juste laisser la
coupure du dessus courir à travers les faces, mais ça peut aussi
demander beaucoup de polys, surtout si vous travaillez sur un
mesh complexe.
Vous pouvez réparer cette situation très rapidement en tournant
les edges sur le mesh dans 3DS Max ou n'importe quel
autres prog 3D de votre choix.
Rapide explication sur comment faire ceci dans 3DS Max : d'abord
vous devez être sur de bien visualiser le triangle, puis vous
appliquer un Edit Mesh à l'objet, mais pas de Edit Poly
ou autre choses de ce genre. Puis vous prenez le mode Edge et
vous sélectionnez tous les triangles du mesh avec un
cliquer-déplacer ou n'importe quelle autre manipulation. Allez tout
en bas du modifier Edit Mesh et utilisez les propriétés de
surface pour rendre les polys visibles (bouton "Visible"). Les
triangles réels, tels que UnrealED les voit, vont se montrer.
Maintenant, il vous faut les tourner (ce n'est pas absolument
nécessaire de les voir pour les tourner mais ça aide beaucoup...),
sélectionnez le bouton Turn et sur votre mesh cliquez
sur un edge pour le tourner vers une autre face. C'est tout :
suivez les chiffres dans l'image suivante :

Lorsqu'un mesh
n'est vraiment pas bien éclairé et qu'il n'y a apparemment rien à
faire ou bien qu'il vous faut une solution rapide, vous pouvez
enlever le static lighting. C'est dans les propriétés du
static mesh -> Display ->
bStaticlight = True/false.
Sans static lighting, un mesh sera plus brillant et
ignorera le blocage de la lumiére de sorte qu'il acceptera
l'éclairage sur ses vertices même si ceux-ci sont à l'intérieur d'un
autre mesh. Ceci peut éventuellement réparer le noir mais
l'éclairage sera flou et souvent pas très joli à voir donc utilisez
ce truc prudemment et de préférence sur de petits détails de
décoration.
Également, l'option
ScaleGlow peut être
intéressante -également dans les propriétés, sous display-
1.00000 est le maximum donc évitez de faire le mesh plus
brillant : utilisez cette option quand votre mesh est trop
brillant par rapport à celui d'à coté et que vous voulez
rééquilibrer les choses. Mettez ce chiffre à 0.6 ou n'importe quoi
d'autres qui ira bien.
Et bien sur, il y a aussi les options AmbientGlow, bUnlit
et bShadowCast, également sous Display.
AmbientGlow
donne une lumiére ambiante au mesh, ce qui peut aussi
s'avérer utile si un mesh est trop sombre.
bUnlit
fait en sorte que le mesh ne puisse pas recevoir de lumiére
et le fera paraître comme en mode textured.
bShadowCast
est logique aussi, le mesh ne bloque pas la lumiére et donc
ne produit pas d'ombres.
|