Changement de texture précis après collision

Questions à propos du scripting Shader.
Avatar de l’utilisateur
Alesk
Messages : 2303
Inscription : 13 Mars 2012 09:09
Localisation : Bordeaux - France
Contact :

Re: Changement de texture précis après collision

Message par Alesk » 16 Mai 2015 11:56

Yondaime13 a écrit :Je viens de voir ta réponse ! :D
Je viens de faire ce que tu m'as dit mais pour simplifier le truc j'ai fait un projet à part entière où je remplace ma vertèbre par un cube aplatit et mon outil par un vulgaire cylindre allongé ! :lol:
Je te mets en ci-joint ce que je viens de faire :)
ok, je regarde ça dès que j'ai 5 minutes
Yondaime13 a écrit :Je savais pas trop de quoi tu parlais quand tu me disais de désactiver l'option d'effacement de la caméra, j'en ai déduit que c'était le paramètre "Occlusion Culling" ;)
Nope, c'est pas ça. Désolé d'avoir été flou, je ne me souvenais plus du terme exact au moment de rédiger le message et ensuite j'ai oublié de compléter.
La bonne option est nommée "Clear Flags" sur ta caméra, et il faut choisir "Don't clear".

Avatar de l’utilisateur
Yondaime13
Messages : 55
Inscription : 16 Mars 2015 16:42

Re: Changement de texture précis après collision

Message par Yondaime13 » 16 Mai 2015 12:06

Ok je viens de changer ça ! ;) Mais ça fait qu'il n'y a plus le fond noir dont tu m'avais parlé :P
----------------------------------------
La bêtise, c'est de la paresse.
----------------------------------------

Avatar de l’utilisateur
Alesk
Messages : 2303
Inscription : 13 Mars 2012 09:09
Localisation : Bordeaux - France
Contact :

Re: Changement de texture précis après collision

Message par Alesk » 16 Mai 2015 14:17

Yo !

Bon j'ai regardé ton essai, il ne manquait pas grand chose pour que ça soit ok :

1) évite de caler tes objets avec des coordonnées à la noix, j'ai tout recalé à 0
2) il faut parenter le cylindre alpha à celui visible dans la main camera, comme ça ils bougent en même temps
3) j'ai passé le format de la render texture à R8, ce qui signifie que seule la composante rouge est renseignée, et codée sur 8 bits, y'a pas besoin de plus. C'est la valeur que je récupère dans la variable "mask" du shader.
4) je t'ai ajouté le shader qui va bien, en partant du shader de base d'unity 5. Dedans tu peux y spécifier une couleur, une texture et une normal map pour chaque état de ton objet (avec ou sans drill)
là j'ai collé une texture d'os et de viande pour le test ^_^
Tu peux aussi gérer indépendamment les valeurs Glossiness Metallic pour chaque état.

La texture Mask correspond à la RenderTexture et suit les UV0 du mesh.

Pour effacer la texture et repartir de zéro sur le dessin, il suffit de repasser le paramètre "Clear Flags" de la caméra à "Solid Color", puis revenir de nouveau à "Don't Clear", il faudra donc que tu te fasses une petite fonction pour ça.
J'ai mis un petit script sur le cylindre afin qu'il se déplace en suivant la souris, si tu fais un clic ça effacera la rendertexture afin de repartir de zéro.

Le projet complet ici : http://www.alesk.fr/stock/drill_shader.unitypackage

Et voici le shader :

Code : Tout sélectionner

Shader "Custom/Detail_AlphaTexture_shader" {
	Properties {
		_Color ("Color", Color) = (1,1,1,1)
		_Glossiness ("Smoothness", Range(0,1)) = 0.5
		_Metallic ("Metallic", Range(0,1)) = 0.0
		
		_MainTex ("Albedo (RGB)", 2D) = "white" {}
		_BumpMap ("BumpMap", 2D) = "bump" {}
		
		_Mask ("Mask Map", 2D) = "gray" {}
		
		_DetailColor ("Details Color", Color) = (1,1,1,1)
		_Detail ("Details Albedo (RGB)", 2D) = "white" {}
		_DetailBump ("Details BumpMap", 2D) = "bump" {}
		
		_DetailGlossiness ("Details Smoothness", Range(0,1)) = 0.5
		_DetailMetallic ("Details Metallic", Range(0,1)) = 0.0
	}
	SubShader {
		Tags { "RenderType"="Opaque" }
		LOD 200
		
		CGPROGRAM
		// Physically based Standard lighting model, and enable shadows on all light types
		#pragma surface surf Standard fullforwardshadows

		// Use shader model 3.0 target, to get nicer looking lighting
		#pragma target 3.0

		sampler2D _MainTex;
		sampler2D _BumpMap;
		
		sampler2D _Mask;
		
		sampler2D _Detail;
		sampler2D _DetailBump;

		struct Input {
			float2 uv_MainTex;
			float2 uv_Detail;
		};

		float4 _Color;
		half _Glossiness;
		half _Metallic;

		float4 _DetailColor;
		half _DetailGlossiness;
		half _DetailMetallic;

		void surf (Input IN, inout SurfaceOutputStandard o) {
			float mask = tex2D (_Mask, IN.uv_MainTex).r;
			float inv_mask = 1-mask;
			
			// Albedo comes from a texture tinted by color
			float4 c = (tex2D (_MainTex, IN.uv_MainTex) * _Color * inv_mask); // texture avant drill
			c = c + (tex2D (_Detail, IN.uv_Detail) * mask *_DetailColor); // texture après drill
		
			o.Normal = (UnpackNormal (tex2D (_BumpMap, IN.uv_MainTex))) * inv_mask + (UnpackNormal (tex2D (_DetailBump, IN.uv_Detail)) * mask);
			
			o.Albedo = c.rgb;
			o.Alpha = c.a;
			
			// Metallic and smoothness come from slider variables
			o.Metallic = _Metallic * inv_mask + _DetailMetallic * mask ;
			o.Smoothness = _Glossiness * inv_mask + _DetailGlossiness * mask;
			
		}
		ENDCG
	} 
	FallBack "Diffuse"
}
Voilà, en creusant un peu là dedans, je pense que tu devrais pouvoir t'en sortir sans trop de problèmes pour la suite, il suffira juste de bien caler ta caméra orthographique sur ton objet.
Dernier détail important : les coordonnées de la texture étant inversées, j'ai donc effectué une rotation de 180° sur l'axe Y de la caméra dans mon exemple

Avatar de l’utilisateur
Yondaime13
Messages : 55
Inscription : 16 Mars 2015 16:42

Re: Changement de texture précis après collision

Message par Yondaime13 » 16 Mai 2015 15:39

Ouah super merci !! :D

J'ai juste encore une ou deux questions car les traces de l'outil ne restent pas ... Je suis chiant je sais :lol:

Le shader que tu as crée c'est normal qu'il soit attaché à aucun objet ?

Et comment je dois faire pour que les traces restent ?
----------------------------------------
La bêtise, c'est de la paresse.
----------------------------------------

Avatar de l’utilisateur
Alesk
Messages : 2303
Inscription : 13 Mars 2012 09:09
Localisation : Bordeaux - France
Contact :

Re: Changement de texture précis après collision

Message par Alesk » 16 Mai 2015 16:39

Tout est fonctionnel dans ce que je t'ai envoyé, avec les traces qui restent.

Le shader est employé par le matériau assigné à l'objet "plane" qui se trouve dans mon exemple...
il faut que tu ouvres la scène "drill_shader" pour tester tout ça.

Avatar de l’utilisateur
Yondaime13
Messages : 55
Inscription : 16 Mars 2015 16:42

Re: Changement de texture précis après collision

Message par Yondaime13 » 16 Mai 2015 17:12

Ah non désolé j'ai eu un problème d'import ! Ca marche ;)

T'es une brute merci 8-)

Quand je pense que je veux bosser dans le jeu vidéo plus tard ... J'ai encore du boulot :lol:
----------------------------------------
La bêtise, c'est de la paresse.
----------------------------------------

Avatar de l’utilisateur
Alesk
Messages : 2303
Inscription : 13 Mars 2012 09:09
Localisation : Bordeaux - France
Contact :

Re: Changement de texture précis après collision

Message par Alesk » 16 Mai 2015 17:47

C'est en forgeant qu'on devient un grand brûlé au 3eme degrés des deux mains :mrgreen:

Répondre

Revenir vers « les Shaders »