Predator Vision: effet de vision thermique


En cherchant la meilleure implémentation de shader thermique, je suis tombé sur un shader matcap publié par bgolus dans les forums Unity - un bon point de départ.

Je l'ai beaucoup changé pour rendre les modèles plus cohérents sous différents angles, en liant le capuchon aux sommets et aux normales. En fait, ce n'est plus du matcap, mais je voudrais quand même rendre hommage à ce shader, d'où tout a commencé.


Nous allons déplacer dans l'ordre, d'abord la fonction vertex:

1. Normal de l'objet:

float3 v.normal; 

2. La position normalisée du sommet part du point de référence du modèle

 float3 vertexN = normalize(v.vertex); 

3. Le produit vectoriel de ces valeurs:

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

4. Réduisez de moitié le crossproduct.xy et le biais pour créer un résultat plus uniforme

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

En fonction de fragment

5. Créez un masque et multipliez

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

6. Projetez la texture de couleur sur le résultat. (J'utilise le style orange-violet, mais vous pouvez utiliser un dégradé plus grand ou autre chose)


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

Voilà, le shader thermique est prêt; Le point important est que vous devez lui donner votre propre étiquette afin que le script de remplacement la définisse correctement, alors assurez-vous que les étiquettes contiennent ceci:

  Tags{ "ThermalVision" = "ThermalColors"} 

Voici le shader complet: lien Pastebin

Remplacement du shader


Pour que le shader thermique puisse en remplacer un autre, il vous suffit d'appliquer la même étiquette sur le shader à remplacer:

 Tags{ "ThermalVision" = "ThermalColors"} 

Et assurez-vous que toutes les propriétés nécessaires sont ouvertes pour le shader remplaçable:

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

Pour changer de shader, vous devez ajouter une deuxième caméra et l'appeler

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


Créez donc une nouvelle caméra et faites-en un enfant par rapport à la caméra principale, puis réinitialisez la position et la rotation afin qu'elles soient situées de la même manière.


Réglez-le sur Couleur unie et sur fond noir.


Dans «Aperçu de l'appareil photo», vous devriez voir tout de la même manière que dans un appareil photo normal, uniquement sans skybox, avec un fond noir.

Il est temps de changer les shaders,

Ajoutez la variable publique Shader et faites-y glisser le shader d'effet thermique.

Ajoutez ensuite la caméra en tant que nouvelle variable et appelez SetReplacementShader dans Start en utilisant le shader public et le nom donné dans les étiquettes

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


Après le démarrage, vous ne devriez voir l'effet thermique que sur les mailles avec un shader remplacé.

Effet d'image



À ce stade, le shader thermique est clairement visible, mais rien n'est visible en dehors de lui. Pour ramener l'environnement à la caméra, j'utilise la texture DepthNormals comme effet d'image en combinaison avec la texture Opaque.

Shader d'effet d'image: Lien vers Pastebin

Ajoutez ce simple script blit à la caméra thermique et faites glisser le shader avec Image Effect

J'ai mis la même image que dans le shader thermique, mais vous pouvez en utiliser une autre!

Script de commutateur de vision thermique



Maintenant, changez-le pendant le jeu.



Pour changer la variable booléenne, qui inclut la caméra, qui effectue le remplacement et la quantité de post-traitement, j'utilise la touche T. Pour revenir en arrière, appuyez à nouveau sur T.

Pour finir, ajoutez un peu de post-traitement à la chambre thermique. J'ai ajouté l'abrégation chromatique et la profondeur de champ.

Voici le script de changement de vision thermique: lien vers le lien Pastebin

(Lorsque vous utilisez PPS 2, vous devrez peut-être effectuer une mise à niveau vers une version plus récente de la pile de post-traitement)

En option


Si vous ne voulez pas que l'effet brille à travers les murs, alors pour la caméra de remplacement, réglez «Solid Color» sur «Don't Clear». Si vous souhaitez que la skybox devienne également noire, dans le code du commutateur, mettez en cache le matériau de la skybox et définissez-le sur null

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

puis le retourner lorsque l'effet thermique est désactivé:

 RenderSettings.skybox = skyboxMaterial; 



Maintenant, cela ressemble moins à des mécanismes de jeu qu'à un simple effet visuel.

Démarrage rapide si vous n'êtes pas intéressé par les explications


1. Téléchargez le shader à effet thermique

2. Téléchargez le shader Toon remplacé OU ajoutez-le à votre propre shader "ThermalVision" = "ThermalColors" et les variables _Matcap , _Mask , _Strength .

3. Créez un deuxième appareil photo, une fille pour le principal, réglez-le sur Solid Color, Black Background

4. Prenez le shader thermique avec Image Effect , créez un matériau et ajoutez le script ThermalBlit à cette deuxième caméra en faisant glisser ce matériau.

5. Ajoutez le script ThermalController , faites glisser le shader d'effet thermique, ajoutez la quantité de post-traitement (facultatif)

6. Appuyez sur T pour activer la vision. (Ce qui doit être affiché doit avoir un shader remplacé).

Les ressources


Code du shader thermique: lien Pastebin

Shader code remplaçant Toon shader: lien vers Pastebin

Code de shader d'effet d'image: Lien vers Pastebin

Script Blit C #: Lien Pastebin

Script de commutateur de vision thermique C #: lien vers Pastebin

Images Matcap:





Informations supplémentaires sur les shaders remplaçables:

Ceci est une vieille vidéo à partir de laquelle j'ai appris à leur sujet: Vidéo sur les shaders de remplacement en faisant bien paraître les choses dans Unity

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


All Articles