Como posso fazer as partículas brilharem e lançar luz sobre os arredores?

22

No momento, estou tentando fazer um efeito de vaga-lume em uma floresta escura. O nível tem pouca luz e o jogador é uma das poucas fontes de luz. Para deixar o jogador ver melhor o nível, estou tentando fazer com que vaga-lumes brilhantes apareçam aleatoriamente no mapa. Uma maneira é usar um sistema de partículas. Mas eu não posso fazer as partículas lançarem luz nos arredores. Existe uma maneira de fazer isso?

DarkDestry
fonte
3
A verdadeira questão aqui é que "a luz é cara". É melhor colocar algumas luzes de ponto fixo que iluminam a área suficientemente, colocar as luzes em um mapa de luz e depois usar as partículas para explicar de onde vem a fonte de luz, em vez de usar dezenas de luzes dinâmicas terrivelmente caras.
Draco18s
@ Draco18s Não haverá dezenas de vaga-lumes. Eles só aparecerão dentro da visão do jogador. É de cima para baixo e, como tal, fácil de controlar. E a qualquer momento, deve haver apenas menos de 10 vaga-lumes. Eu não suponho que 10 pontos dinâmicos de luz sejam caros?
DarkDestry
Por padrão, o Unity permite que apenas duas luzes dinâmicas ativas iluminem a geometria por vez (embora possa ser diferente para uma configuração 2D). Você pode aumentar isso, é claro, mas lembre-se de que +1 de luz tem um impacto de x2 em chamadas de compra.
Draco18s
2
@ Draco18s, isso pode ser verdade no caminho de renderização para a frente, mas conforme indicado nos documentos "Ao usar sombreamento diferido, não há limite para o número de luzes que podem afetar um objeto" - Muitas luzes pequenas que afetam apenas uma pequena parte da a tela é exatamente o tipo de caminho de renderização diferida do caso de uso que se destaca no manuseio eficiente. (Com um custo típico de uma chamada de desenho por luz único, em vez de um multiplicador como com o processamento para a frente)
DMGregory
Este é um bom ponto. Eu esqueço os diferentes caminhos de renderização na maioria das vezes.
precisa saber é o seguinte

Respostas:

7

Agora, as partículas emissoras de luz são um recurso do Unity integrado no 5.5.

Simplesmente ative Luzes no inspetor de partículas, faça uma referência a uma pré-fabricada de luz (as luzes de ponto e de ponto funcionam) e altere a Relação para 1.

insira a descrição da imagem aqui

E voilà, partículas que emitem luzes: ! [insira a descrição da imagem aqui

Acontece que esta é uma configuração bastante otimizada, rodando a 1500 + fps no meu equipamento, mesmo com o máximo de luzes nas centenas.

Edit: Após algumas observações, parece-me que as luzes das partículas alternam entre iluminação por fragmento e iluminação de vértice (presumivelmente para otimização?). Isso pode produzir pequenas quantidades de artefatos visuais se o máximo de luzes estiver definido muito alto.

Edit2: Como apontado pelo DMGregory, os artefatos são um subproduto das otimizações de renderização direta. A iluminação diferida resolve o problema. Added nicer gif

eclmista
fonte
1
Boas notícias! :) Essa resposta seria ainda melhor se incluísse algumas instruções passo a passo sobre como configurar isso com os novos recursos do sistema de partículas.
DMGregory
1
O comportamento da iluminação de vértice que você vê parece um pouco com algumas das otimizações que o Unity aplica na renderização direta. Você vê o mesmo comportamento ao usar o caminho adiado?
DMGregory
Você está certo! Os artefatos não estão mais presentes ao usar o caminho de renderização adiada.
Eclmist # 30/16
31

Atenção:

Esta resposta está desatualizada. A unidade agora suporta partículas de luz pontuais nativamente. Por favor, veja esta resposta para mais detalhes.

Vou deixar esse post aqui para qualquer pessoa curiosa, ou usando versões antigas do Unity, ou precisando de mais controle manual do que o método nativo oferece - observe que o suporte nativo provavelmente será muito mais eficiente e escalável do que a abordagem apresentada abaixo.


Não sei por que tantas respostas afirmam que isso é difícil ou impossível. O manuseio de algumas dezenas de luzes de ponto dinâmico é bastante convencional para um pipeline de renderização diferida moderno em execução no PC.

Aqui está um exemplo rápido que eu preparei: Exemplo de vaga-lumes com luzes

Eu uso esse script para gerar dinamicamente luzes suficientes para minhas partículas máximas (certifique-se de ajustar as configurações do sistema de partículas para que o máximo seja razoável - o padrão de 1000 não deixará sua placa gráfica muito feliz) e atualize-as para seguir as instruções ativas partículas:

[RequireComponent(typeof(ParticleSystem))]
public class ParticleLights : MonoBehaviour {

    public Light lightPrefab;

    ParticleSystem _system;
    ParticleSystem.Particle[] _particles;
    Light[] _lights;


    void Start () {
        _system = GetComponent<ParticleSystem>();
        _particles = new ParticleSystem.Particle[_system.maxParticles];

        _lights = new Light[_system.maxParticles];
        for(int i = 0; i < _lights.Length; i++)
        {
            _lights[i] = (Light)Instantiate(lightPrefab);
            _lights[i].transform.parent = transform;
        }
    }

    void Update () {

        int count = _system.GetParticles(_particles);
        for(int i = 0; i < count; i++)
        {
            _lights[i].gameObject.SetActive(true);
            _lights[i].transform.localPosition = _particles[i].position;

            // Looks like the GetCurrentColor function was added in 5.3.
            // You can use other methods in earlier Unity versions.
            _lights[i].color = _particles[i].GetCurrentColor(_system);
        }

        for (int i = count; i < _particles.Length; i++)
        {
            _lights[i].gameObject.SetActive(false);
        }
    }
}

Editar: você pode criar uma pré - fabricada criando primeiro um objeto de jogo (neste caso, Criar -> Luz -> Luz de ponto), configurando-o com o nome / parâmetros / scripts / filhos que deseja e arrastando-o da sua Hierarquia para seu explorador de projetos. Isso salva o objeto como um ativo que você pode reutilizar em várias cenas e scripts, com um grau de herança. Você pode excluir a cópia em sua cena e o ativo permanecerá na pasta Ativos para ser referenciado quando necessário.

Certifique-se de que o lightPrefab tenha um alcance relativamente pequeno e não seja transmitido por sombras, para oferecer o máximo de desempenho para tudo o que acontece na sua cena. Você não precisa tornar o lightPrefab verde (ou a cor dos seus vaga-lumes) - ele será absorvido pela cor das partículas.

Você pode achar que tem um controle melhor sobre o voo dos vaga-lumes se criar cada um seu próprio GameObject, com um quad de outdoor e uma luz anexada a um script de movimento / piscada personalizado, pois obter uma caminhada convincente requer mais arte do sistema de partículas do que Eu sei. ;)

DMGregory
fonte
Na verdade ... embora eu tenha dito para não usar a transmissão de sombra para os vaga-lumes, tentei ativá-lo na minha cena de exemplo e não causou nenhum problema. A maneira como as sombras oscilam à medida que os vaga-lumes passam pelos objetos é muito legal e pode contribuir para uma atmosfera assustadora. Sua milhagem pode variar de acordo com a complexidade da sua cena e do seu hardware de destino, então faça um perfil, com certeza, mas esse pode ser um caso de otimização prematura da minha parte. :)
DMGregory
Como você cria uma casa pré-fabricada leve?
precisa saber é o seguinte
Além disso, por algum motivo, ParticleSystem.Particle refere-se à partícula herdada. Não existe um método GetCurrentColor ou GetCurrentSize para ele.
DarkDestry
@DarkDestry Adicionei uma observação à resposta sobre a criação de prefabs. Quanto às funções ausentes, isso pode ser um problema de versão - estou trabalhando no 5.3, nas versões anteriores do Unity você pode fazer isso de uma maneira diferente. Vamos discutir os detalhes da implementação no chat , usando a sala que Hamza Hasan gentilmente criou.
DMGregory
Portanto, uma pré-fabricada leve é ​​igual a uma pré-fabricada normal. Estava confuso quando é mencionado como uma casa pré-fabricada leve.
DarkDestry
3

Anos atrás, antes que as luzes dinâmicas fossem acessíveis, simplesmente usaríamos um efeito de partícula em outdoor em 2D com mistura aditiva. Isso iluminaria a cena em direção ao branco. Ao desenhá-lo com a profundidade correta do vaga-lume, você obtém a classificação quase correta. O alfa aditivo não precisa ser classificado quando se desenrola em comparação com a mistura alfa. Não iluminará TODA a cena, mas iluminará a área ao redor do vaga-lume. Você pode pegar uma luz dinâmica e escolher um dos vaga-lumes a cada poucos segundos para realmente iluminar a cena, se necessário.

Já existe uma pergunta e resposta sobre efeitos de brilho Como obter uma iluminação como esta no Unity para jogos 2D?

Steven
fonte
0

Infelizmente, eu não tive muita experiência com o Unity em sua forma atual (eu brinquei com ele há muitos anos), então não sei exatamente com quais conjuntos de recursos você deve trabalhar no mecanismo.

De qualquer forma, não importa com qual mecanismo você trabalhe, as luzes dinâmicas são algo a evitar sempre que possível. Eles são muito caros em termos computacionais e tendem a adicionar complexidade de cena de maneira muito exponencial. No entanto, como é a ordem do dia para a maioria das renderizações em 3D, há muitas maneiras de obter efeitos semelhantes trapaceando;

Uma maneira possível de obter um efeito semelhante é mapear uma textura de brilho pré-fabricada para o terreno abaixo dos vaga-lumes (assumindo um sistema de coordenação Y = para cima / para baixo) com as posições X e Z controlando a localização do brilho no terreno e o deslocamento Y do terreno que controla o alfa da textura (mais brilhante = mais próximo do terreno)

Obviamente, existem várias desvantagens neste método. Você não projeta sombras porque nenhuma luz é usada e não afeta nenhuma outra geometria no mundo (adereços, folhagem etc.)

JonBee
fonte
-2

Use Lightna origem do fogo e brinque com seu tamanho no script para que ele dê efeito de queima. E use seu sistema de partículas :)

Hamza Hasan
fonte
Não há fogo na cena. Estou tendo partículas escassas dentro e fora da existência. Não existe uma posição fixa para as partículas. Por favor, leia a pergunta.
DarkDestry
Então qual é o acordo? você pode anexar a luz à sua partícula pré-fabricada em vez de em posições pré definidas
Hamza Hasan
A questão é como fazer isso. Estou usando o sistema de partículas da unidade. E eu não vejo uma casa pré-fabricada lá. A menos que você está me pedindo para apenas criar um pré-fabricado que tem uma luz e gerar base sobre roteiro
DarkDestry
Então você tem gameObject de partículas em cena. Anexe uma luz ao mesmo objeto do jogo e faça uma pré-fabricação arrastando o gameObject para o Unity File Explorer.
amigos estão
Eu tenho um gameObject do Particle System na cena. Não é uma partícula.
DarkDestry