Come occludere le luci in Unity3D?


9

Prima di tutto, possiedo Unity Pro.

Ho cercato luci occulte quando non sono state visualizzate per un po 'di tempo per migliorare le prestazioni. I metodi principali in cui mi sono imbattuto sono stati utilizzando BecameVisible () e testare il frustum della fotocamera.

Il mio problema principale era che se il giocatore sta visualizzando un'area che sarebbe illuminata dalla luce, voglio comunque che la luce sia accesa.

Attualmente sto usando un metodo che controlla se l'area illuminata si trova nel frustum della telecamera, ma il problema è che a volte le luci sono nel frustum senza essere effettivamente visibili dal giocatore (ad es. Un muro tra loro e il giocatore). Ho provato a trasmettere loro il raycasting, ma non puoi mai essere abbastanza dettagliato per l'area illuminata effettiva (la cosa migliore che potessi immaginare era usare renderer.bounds.extent e renderer.bounds.center per calcolare i punti illuminati massimi dalla luce).

Qualcuno conosce un modo semplice in Unity Pro per occludere le luci? O potresti dirmi un buon modo per usare quel metodo fulcro della fotocamera di cui stavo parlando?


1
Puoi verificare se il frustum della fotocamera e il frustum delle luci si intersecano, ma mi aspetto che l'unità lo stia già facendo.
Archy,

1
In Unity Pro, OcclusionCulling dovrebbe gestire anche le luci.
Archy,

Bene, il mio artista aveva detto che Occlusion Culling non avrebbe funzionato per le luci. Quindi probabilmente avrei appena impostato le mie varie sorgenti luminose come occluse nelle aree di occlusione che ho già impostato?
Timothy Williams,

E qualcosa come il controllo della fotocamera e del leggero frustum l'uno contro l'altro potrebbe funzionare, anche se ne avrei bisogno per funzionare a 360 gradi.
Timothy Williams,

L'abbattimento dell'occlusione sembra non funzionare con le luci, nonostante ciò che io e l'artista ci proviamo. Come esattamente occluderei una luce?
Timothy Williams,

Risposte:


1

Potresti scrivere la tua sceneggiatura per occludere luci. Qualcosa del genere collegato alla fotocamera 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;
        }
    }
}

Puoi anche verificare se il punto si trova all'interno di un angolo sull'asse Y della videocamera (gli altri assi ti daranno solo dolore). Sii un po 'generoso con l'angolazione, forse 2 volte il frustrazione della fotocamera, in modo che le luci non si spengano quando illuminano le aree all'interno della vista della fotocamera. Se scegli di aggiungere questa ulteriore ottimizzazione (che probabilmente non sarà necessaria), assicurati di utilizzare la distanza come fase larga perché è molto meno costosa.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.