J'ai besoin d'aide pour l'ombrage / l'éclairage 3D

8

Comment gérez-vous l'ombrage dans un jeu en 3D? J'ai une source de lumière directionnelle qui ombrage un côté d'un arbre en cubes. Les 3 côtés restants ont tous un ombrage ambiant uniquement. Ainsi, l'effet 3D est perdu lorsque l'on regarde deux côtés ombrés ambiants. Suis-je en train de manquer quelque chose? Dois-je ombrager le côté le plus éloigné de la source de lumière encore plus sombre? J'ai essayé de regarder Fallout 3 et cela ressemble un peu à ce qu'ils font, mais Minecraft semble ombrager un monticule d'herbe avec deux côtés opposés lumineux et les deux autres côtés opposés sombres un peu donnant l'effet qu'il y a deux lumières directionnelles pour les deux lumières côtés ombragés et lumière ambiante pour les côtés ombragés sombres.

Xavier
la source

Réponses:

5

Votre problème est que votre lumière ambiante est d'une couleur constante. En réalité, la lumière ambiante a tendance à être brillante par le haut et sombre par le bas, car la lumière vient généralement d'en haut.

Vous pouvez faire beaucoup pour résoudre ce problème. À tout le moins, vous devriez avoir des constantes de vertex shader "couleur ambiante supérieure", "couleur ambiante inférieure" et "direction ambiante supérieure".

Dans votre vertex shader, prenez le produit scalaire de la "direction ambiante supérieure" et du sommet normal, et utilisez le résultat pour lerp entre la "couleur ambiante supérieure" et la "couleur ambiante inférieure:"

float value = dot( vertex_normal, top_ambient_direction ) * 0.5 + 0.5;
ambient_color = lerp( bottom_ambient_color, top_ambient_color, value );

C'est l'un des moyens les plus simples d'améliorer l'apparence de l'environnement et a été souvent utilisé dans les jeux PS2 et XBOX1. Les jeux contemporains vont plus loin en utilisant un "cubemap ambiant" ou des "coefficients harmoniques sphériques d'ambiance".

bmcnett
la source
3

C'est un sujet complexe, et je suis à peine qualifié pour en parler, mais je vais essayer. De nombreux jeux utilisent une carte de lumière précuite qui prend en compte la lumière qui rebondit sur plusieurs surfaces, puis la combine avec un éclairage dynamique pour produire un environnement rapide, réaliste et beau. Il existe probablement des jeux modernes qui font rebondir la lumière en temps réel.

Il faut garder à l'esprit que la lumière s'atténue avec la distance; si votre lampe est inclinée par rapport à une surface, le bord le plus proche sera plus brillant que le bord le plus éloigné. Les choses ont tendance à sembler très fausses si une lampe brille sur elles plutôt que sous un angle.

L'éclairage de Minecraft est spécial, car il utilise un système étrange où la lumière est traitée presque comme de la chaleur diffusant à travers le monde: http://www.minecraftwiki.net/wiki/Light Ce n'est pas facilement étendu à une solution à usage général.

L'effet le plus cool que j'ai vu utilisé est appelé occlusion ambiante. Il est cher et n'est généralement utilisé que dans une solution précuite, mais il prend en compte la façon dont les coins de la pièce sont plus sombres car les murs obstruent la lumière ambiante; le milieu du mur a une valeur de lumière d'un hémisphère, tandis que le coin où trois surfaces se rencontrent n'a qu'une valeur de lumière d'un hémisémisphère (1/8 sphère).https://secure.wikimedia.org/wikipedia/en/wiki/Ambient_occlusion

Il y a des tonnes et des tonnes d'écrits sur les systèmes d'éclairage; chercher autour de vous vous servira probablement bien.

Gregory Avery-Weir
la source
0

L'éclairage / l'ombrage doit être plus avancé qu'une simple décision binaire. Les blocs ne sont ni éclairés ni complètement éteints par une lumière, ils peuvent être partiellement éclairés. Parfois, le visage doit être totalement brillant, auquel cas il est directement touché par la lumière. Parfois, vous ne voulez que la lumière ambiante, si elle n'est pas complètement touchée par la lumière. Cependant, lorsqu'il est partiellement masqué, vous devez lui donner une valeur de lumière entre entièrement éclairé et complètement éteint.

La méthode d'éclairage de base standard passe de la lumière zéro à la lumière maximale en fonction de la différence d'angle entre le rayon lumineux entrant et la normale de surface du visage que vous allumez.

Si la normale de la surface est égale (ou opposée, selon la façon dont vous la regardez), vous avez une luminosité maximale. À mesure que l'angle entre la lumière entrante et la surface normale augmente, vous obtenez de moins en moins de lumière sur ce visage à partir de cette lumière.

De cette façon, avec deux lumières, chaque visage devrait recevoir une luminosité qui est une combinaison de la luminosité que chaque lumière met sur chaque visage en fonction de son angle.

Cela devrait être beaucoup plus naturel que d'essayer de déterminer si un seul visage est éclairé ou non. Vous aurez un dégradé naturel à mesure que les surfaces s'éloignent de la lumière, et vous obtiendrez un équilibre pour les surfaces affectées par plus d'une lumière.

SpacePrez
la source