VERTEX LIGHTING

 

 

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.