Jak zasłonić światła w Unity3D?

9

Po pierwsze, mam Unity Pro.

Od jakiegoś czasu staram się zasłaniać światła, gdy nie są one oglądane, aby poprawić wydajność. Głównymi metodami, na które natknąłem się, było użycie BecameVisible () i testowanie fragmentu kamery.

Moim głównym problemem było to, że jeśli odtwarzacz ogląda obszar oświetlony światłem, nadal chcę, aby światło było włączone.

Obecnie używam metody, która sprawdza, czy oświetlony obszar znajduje się w frustum kamery, ale problem polega na tym, że czasami światła znajdują się w frustum, a tak naprawdę nie są widoczne dla gracza (np. Ściana między nimi a graczem). Próbowałem z nimi wykonać raycasting, ale nigdy nie można uzyskać wystarczająco szczegółowych informacji dla rzeczywistego oświetlonego obszaru (najlepsze, co mogłem wymyślić, to użycie renderer.bounds.extent i renderer.bounds.center do obliczenia maksymalnej liczby oświetlonych punktów na świetle).

Czy ktoś wie, jak w Unity Pro można łatwo zasłonić światło? A może mógłbyś mi powiedzieć, w jaki sposób użyć tej metody podparcia kamery, o której mówiłem?

Timothy Williams
źródło
1
Możesz sprawdzić, czy frustum kamery i frustum światła przecinają się, ale spodziewam się, że jedność już to robi.
Archy
1
W Unity Pro funkcja OcclusionCulling również powinna obsługiwać światła.
Archy
W porządku, mój artysta powiedział, że Culling okluzji nie będzie działać na światła. Więc prawdopodobnie po prostu ustawiłbym różne źródła światła jako okludujące w obszarach okluzji, które już skonfigurowałem?
Timothy Williams
Może działać coś takiego, jak sprawdzanie aparatu i jasnego frustum względem siebie, chociaż potrzebowałbym go do pracy w 360 stopniach.
Timothy Williams
Culling okluzji wydaje się nie działać ze światłami, pomimo tego, co próbujemy z artystą. Jak dokładnie miałbym zasłonić światło?
Timothy Williams

Odpowiedzi:

1

Możesz napisać własny skrypt, aby zasłonić światła. Coś takiego przymocowane do głównego aparatu:

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;
        }
    }
}

Możesz również sprawdzić, czy punkt znajduje się w kącie na osi Y kamery (inne osie po prostu sprawią ci ból). Bądź trochę hojny przy kącie, może 2-krotnym frustracji aparatu, aby światła nie wyłączały się, gdy oświetlają obszary w polu widzenia kamery. Jeśli zdecydujesz się dodać tę dodatkową optymalizację (która prawdopodobnie nie będzie konieczna), upewnij się, że używasz odległości jako fazy szerokopasmowej, ponieważ jest ona o wiele tańsza.

JPtheK9
źródło
Ładnie i prosto :)
ṅḡáḿíṅḡ Ⱬỏḿƀíé