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 PastebinSubstituiçã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 PastebinAdicione 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 PastebinCódigo Shader substituindo o Toon shader: link para PastebinCódigo de sombreamento de efeito de imagem: Link para PastebinScript em branco do C #: link PastebinScript de comutação de visão térmica em C #: link para PastebinImagens 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