Comment occlure des lumières dans Unity3D?

9

Tout d'abord, je possède Unity Pro.

Je cherche à occlure les lumières lorsqu'elles ne sont pas vues depuis un certain temps maintenant pour améliorer les performances. Les principales méthodes que j'ai rencontrées consistaient à utiliser BecameVisible () et à tester le tronc de la caméra.

Mon principal problème était que si le joueur regarde une zone qui serait éclairée par la lumière, je veux toujours que la lumière soit allumée.

Actuellement, j'utilise une méthode qui vérifie si la zone éclairée se trouve dans le tronc de la caméra, mais le problème est parfois que les lumières sont dans le tronc sans être réellement visibles par le joueur (par exemple, un mur entre eux et le joueur). J'ai essayé de diffuser des rayons avec eux, mais vous ne pouvez jamais obtenir suffisamment de détails pour la zone éclairée réelle (le mieux que je pouvais comprendre était d'utiliser renderer.bounds.extent et renderer.bounds.center pour calculer les points d'éclairage maximum à partir de la lumière).

Quelqu'un connaît-il un moyen simple dans Unity Pro d'occlure les lumières? Ou pourriez-vous me dire un bon moyen d'utiliser la méthode du point d'appui de la caméra dont je parlais?

Timothy Williams
la source
1
Vous pouvez vérifier si le tronc de la caméra et le tronc des lumières se croisent, mais je m'attends à ce que l'unité le fasse déjà.
Archy
1
Dans Unity Pro, OcclusionCulling devrait également gérer les lumières.
Archy
D'accord, mon artiste avait dit qu'Occlusion Culling ne fonctionnerait pas pour les lumières. Donc, je définirais probablement mes différentes sources de lumière comme des occluses dans les zones d'occlusion que j'ai déjà configurées?
Timothy Williams
Et quelque chose comme vérifier la caméra et le tronc de lumière l'un contre l'autre peut fonctionner, même si j'en aurais besoin pour fonctionner à 360 degrés.
Timothy Williams
L'abattage d'occlusion semble ne pas fonctionner avec les lumières, malgré ce que l'artiste et moi essayons. Comment obtiendrais-je exactement une lumière?
Timothy Williams

Réponses:

1

Vous pouvez écrire votre propre script pour masquer les lumières. Quelque chose comme ça attaché à la caméra principale:

List<Light> Lights = new List<Light>();
const float OccludeDist = 100;
void Update()
{
    foreach (Light light in Lights)
    {
        if ((transform.position - light.transform.position).sqrMagnitude > OccludeDist * OccludeDist))
        {
            light.enabled = false;
        }
        else{
            light.enabled = true;
        }
    }
}

Vous pouvez également vérifier si le point est dans un angle sur l'axe Y de la caméra (les autres axes ne feront que vous faire mal). Soyez un peu généreux avec l'angle, peut-être 2 fois le frustration de la caméra, afin que les lumières ne s'éteignent pas lorsqu'elles éclairent des zones à la vue de la caméra. Si vous choisissez d'ajouter cette optimisation supplémentaire (qui ne sera probablement pas nécessaire), assurez-vous que vous utilisez la distance comme grand-angle, car elle est beaucoup moins coûteuse.

JPtheK9
la source
Nice and simple :)
Ḟḹáḿíṅḡ Ⱬỏḿƀíé