Como ocultar luzes no Unity3D?

9

Primeiro, eu tenho o Unity Pro.

Tenho procurado ocultar as luzes quando elas não estão sendo visualizadas por um tempo agora para melhorar o desempenho. Os métodos principais para os quais me deparei foram usar BecameVisible () e testar o perfil da câmera.

Meu principal problema era que, se o player estivesse visualizando uma área que seria iluminada pela luz, eu ainda quero que a luz acenda.

Atualmente, estou usando um método que verifica se a área iluminada está no frustum da câmera, mas o problema é que algumas vezes as luzes estão no frustum sem realmente serem visíveis pelo jogador (por exemplo, uma parede entre eles e o player). Eu tentei fazer o raycasting para eles, mas você nunca pode obter detalhes suficientes para a área iluminada real (o melhor que pude imaginar foi usar renderer.bounds.extent e renderer.bounds.center para calcular o máximo de pontos iluminados da luz).

Alguém conhece uma maneira fácil no Unity Pro de ocultar luzes? Ou você poderia me dizer uma boa maneira de usar o método de ponto de apoio de câmera que eu estava falando?

Timothy Williams
fonte
11
Você pode verificar se o frustum da câmera e o frustum das luzes se cruzam, mas espero que a unidade já esteja fazendo isso.
Archy
11
No Unity Pro, o OcclusionCulling também deve lidar com luzes.
Archy
Tudo bem, meu artista havia dito que o Oclusion Culling não funcionaria para luzes. Então eu provavelmente colocaria minhas várias fontes de luz como oclusas nas áreas de oclusão que eu já configurei?
Timothy Williams
E algo como checar a câmera e o fardo de luz um contra o outro pode funcionar, embora eu precise trabalhar em 360 graus.
Timothy Williams
A seleção por oclusão parece não estar funcionando com luzes, apesar do que o artista e eu tentamos. Como exatamente ocluiria uma luz?
Timothy Williams

Respostas:

1

Você pode escrever seu próprio script para ocultar as luzes. Algo assim anexado à câmera principal:

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

Você também pode verificar se o ponto está dentro de um ângulo no eixo Y da câmera (os outros eixos apenas causam dor). Seja um pouco generoso com o ângulo, talvez duas vezes o frustração da câmera, para que as luzes não se apaguem quando estiverem iluminando áreas dentro da visão da câmera. Se você optar por adicionar essa otimização adicional (que provavelmente não será necessária), certifique-se de usar a distância como fase larga, porque é muito menos dispendioso.

JPtheK9
fonte
Nice and :) simples
flamejante Ⱬỏḿƀíé