Unidade: aplique um efeito de imagem em apenas uma camada

8

Por favor, considere esta cena simples.

insira a descrição da imagem aqui

É composto por 3 objetos de jogo diferentes. 1 imagem de plano de fundo + 1 imagem de personagem estática + 1 parte pequena (com o animal de estimação) que é alterada no tempo de execução para executar uma animação.

insira a descrição da imagem aqui

O fundo é renderizado usando uma câmera dedicada. O personagem (estático + anim) é renderizado usando outra câmera dedicada. Ambas as câmeras são definidas como Profundidade apenas com uma máscara de descarte diferente (cada câmera renderiza apenas sua parte). Observe que a câmera responsável pelo personagem tem uma profundidade maior que a responsável pelo fundo (ou seja, o personagem é renderizado após o fundo).

Preciso aplicar um efeito de imagem apenas na câmera do personagem, mas não consigo encontrar uma maneira de esse efeito não afetar o fundo.

Exemplo aqui com um efeito Vortex na câmera do personagem.

insira a descrição da imagem aqui

Como você faria esse truque?

lvictorino
fonte

Respostas:

8

O problema é que o efeito da imagem captura a tela atual após a renderização.

Como sua câmera é renderizada diretamente no backbuffer (eles apenas limpam a profundidade), o efeito da imagem se aplica a tudo.

A solução pode ser:

  • Configure primeiro uma câmera que seja clara, com uma cor transparente, com uma configuração RenderTarget (você pode criá-la por script para que ela tenha o mesmo tamanho da tela) e o pós-processo desejado.
  • Configure uma câmera em segundo lugar que renderize seu plano de fundo, que desmarque para cor de fundo / skybox
  • Configure uma terceira câmera que não renderize nada (máscara de seleção definida como Nothing), limpe nada e tenha o script AlphaBlit.cs anexado a ela. O AlphaBlit precisa de duas informações: um material que use o AlphaBlit.shader e o rendertarget para combinar (você precisará atribuí-lo por script se você o criou por script na 1ª etapa)
  • Configure uma quarta câmera que renderize seu caractere avançado.

CUIDADO: este é um algoritmo de pintor. Significando que tudo o que a terceira câmera renderiza é renderizado além do que já existe, e a quarta câmera renderiza além disso.

Não tenho certeza de que haja uma maneira de melhorar, pois seria necessário distorcer o buffer de profundidade, o que não é possível ... (não sem renderizar diretamente com um efeito de vórtice que é mais difícil) ...

É claro que a maneira mais otimizada de fazê-lo seria não aplicar o pós-processo na 1ª câmera, mas apenas renderizá-lo em um alvo de rendert e modificar o AlphaBlit.shader para fazer o efeito de vórtice à medida que RenderTarget fosse escolhido. Mas isso é mais complexo.

Sirithang
fonte
Obrigado pela sua resposta. Estou com alguns problemas com "Renderize uma câmera com um script que simplesmente faz no OnRenderImage um pouco desse RenderTarget no destino de renderização de destino (ou seja, o backbuffer aqui)". .. porque, mesmo que a cor seja preta transparente, tudo fica preto uma vez que é um pouco.
Lvictorino 27/11/2015
resposta editada com mais precisão
Sirithang 27/11/2015
O fluxo de trabalho da solução básica está bom, mas estou enfrentando um problema inesperado com o alfa aqui. Na verdade, eu quero desfocar os níveis de primeiro plano. Esta solução funciona, mas parece de alguma forma conectada. puu.sh/C6sSB/ca5d5162b0.jpg Se eu mudar a cor das bandeiras claras para Magenta com 0 transparência, ele terá um contorno magenta estranho nas laterais (deve ser apenas transparente). puu.sh/C6sSB/ca5d5162b0.jpg . Isso faz com que toda a solução não funcione para mim. Não sei ao certo por que isso acontece. Alternar sinalizadores limpos não ajuda.
AvrDragon