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 PastebinRemplacement 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 PastebinAjoutez 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 PastebinShader code remplaçant Toon shader: lien vers PastebinCode de shader d'effet d'image: Lien vers PastebinScript Blit C #: Lien PastebinScript de commutateur de vision thermique C #: lien vers PastebinImages 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