Visão Predadora: Efeito de Visão Térmica


Enquanto procurava a melhor implementação de shader térmico, me deparei com um matcap shader publicado pela bgolus nos fóruns do Unity - um bom ponto de partida.

Eu mudei muito para tornar os modelos mais consistentes em ângulos diferentes, amarrando a tampa aos vértices e aos normais. Na verdade, isso não é mais um problema, mas eu ainda gostaria de prestar homenagem a esse sombreador, do qual tudo começou.


Vamos mover em ordem, primeiro a função de vértice:

1. Normal do objeto:

float3 v.normal; 

2. A posição normalizada do vértice começa no ponto de referência do modelo

 float3 vertexN = normalize(v.vertex); 

3. O produto vetorial desses valores:

 float3 viewCross = cross(vertexN, v.normal); 

4. Corte pela metade o crossproduct.xy e o viés para criar um resultado mais uniforme

 o.cap = viewCross.xy * 0.5 + 0.5; 

Em função de fragmento

5. Crie uma máscara e multiplique

 fixed4 m = tex2D(_Mask, i.uv); i.cap *= (1 - mg); 

6. Projete a textura da cor no resultado. (Eu uso o estilo laranja-violeta, mas você pode usar um gradiente maior ou outra coisa)


 fixed4 color = tex2D(_Matcap, i.cap); 

É isso aí, o shader térmico está pronto; O ponto importante é que você precisa atribuir seu próprio rótulo para que o script de substituição o defina corretamente, portanto, verifique se os rótulos contêm o seguinte:

  Tags{ "ThermalVision" = "ThermalColors"} 

Aqui está o shader completo: link Pastebin

Substituição do sombreador


Para que o shader térmico possa substituir outro, basta aplicar a mesma etiqueta ao shader que precisa ser substituído:

 Tags{ "ThermalVision" = "ThermalColors"} 

E verifique se todas as propriedades necessárias estão abertas para o shader substituível:

 _Mask("G = no thermal", 2D) = "black" {} _Matcap("Matcap", 2D) = "white" {} _Strength("Mask Strength", Range(0,2)) = 0.4 

Para mudar o shader, você precisa adicionar uma segunda câmera e pedir por ela

 camera.SetReplacementShader(Shader, "NamedShader"); 
.


Portanto, crie uma nova câmera e faça dela uma criança em relação à câmera principal e, em seguida, redefina a posição e a rotação para que elas estejam localizadas da mesma maneira.


Defina-o como Solid Color e um fundo preto.


Em "Visualização da câmera", você deve ver tudo igual a uma câmera normal, apenas sem skybox, com fundo preto.

É hora de mudar os shaders,

Adicione a variável pública Shader e arraste o shader de efeito térmico para ela.

Em seguida, adicione a câmera como uma nova variável e chame SetReplacementShader em Start usando o shader público e o nome dado nos rótulos

  public Shader ThermalShader; Camera cam; void Start() { cam = GetComponent<Camera>(); cam.SetReplacementShader(ThermalShader, "ThermalVision"); } 


Após iniciar, você verá o efeito térmico apenas nas malhas com um shader substituído.

Efeito de imagem



Nesta fase, o shader térmico é claramente visível, mas nada é visível além dele. Para trazer o ambiente de volta para a câmera, eu uso a textura DepthNormals como efeito de imagem em combinação com a textura opaca.

Image Effect Shader: Link para Pastebin

Adicione esse script de blit simples à câmera térmica e arraste o shader com o Image Effect

Coloquei a mesma imagem do shader térmico, mas você pode usar outro!

Script de visão térmica



Agora basta trocá-lo durante o jogo.



Para alternar a variável booleana, que inclui a câmera, realizando a substituição e a quantidade de pós-processamento, eu uso a tecla T. Para voltar, pressione T. novamente.

Para finalizar, adicione um pouco de pós-processamento à câmara térmica. Adicionei Abberação Cromática e Profundidade de Campo.

Aqui está o script de comutação de visão térmica: link para Pastebin Link

(Ao usar o PPS 2, pode ser necessário atualizar para uma versão mais recente da pilha de pós-processamento)

Opcional


Se você não deseja que o efeito brilhe através das paredes, na câmera de reposição, defina “Solid Color” para “Don't Clear”. Se você quiser que o skybox fique preto também, no código do switch, coloque em cache o material do skybox e defina-o como nulo

 Private Material SkyboxMaterial; skyboxMaterial = RenderSettings.skybox; RenderSettings.skybox = null; 

e depois devolva-o quando o efeito térmico estiver desativado:

 RenderSettings.skybox = skyboxMaterial; 



Agora é menos como mecânica de jogo e mais como um simples efeito visual.

Início rápido se você não estiver interessado em explicações


1. Faça o download do shader de efeito térmico

2. Faça o download do sombreador Toon substituído OU adicione ao seu próprio sombreador "ThermalVision" = "ThermalColors" e as variáveis _Matcap , _Mask , _Strength .

3. Crie uma segunda câmera, uma filha para a principal, defina-a como Solid Color, Black Background

4. Pegue o shader térmico com Image Effect , crie um material e adicione o script ThermalBlit a esta segunda câmera, arrastando esse material.

5. Adicione o script ThermalController , arraste o sombreador de efeito térmico, adicione a quantidade de pós-processamento (opcional)

6. Pressione T para ativar a visão. (O que deve ser exibido deve ter um shader substituído).

Recursos


Código de Shader Térmico: Link Pastebin

Código Shader substituindo o Toon shader: link para Pastebin

Código de sombreamento de efeito de imagem: Link para Pastebin

Script em branco do C #: link Pastebin

Script de comutação de visão térmica em C #: link para Pastebin

Imagens Matcap:





Informações adicionais sobre shaders substituíveis:

Este é um vídeo antigo do qual eu aprendi sobre eles: Vídeo sobre Shaders de substituição, fazendo as coisas parecerem boas no Unity

Source: https://habr.com/ru/post/pt482928/


All Articles