Shader avec option Rotation texture

Questions à propos du scripting Shader.
Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6186
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Shader avec option Rotation texture

Message par boubouk50 » 28 Nov 2019 12:44

Oula, faut pas mettre l'huile en premier si tu veux faire monter la mayonnaise! :-D

tu peux tout faire dans le premier et virer le second.
Tu définis ta couleur en début (ça c'est bon avec _Color)
Tu dois "l'instancier" (je ne connais pas le terme) comme tu le fais avec les sampler2D et float4x4.
Puis tu dois l'utiliser dans le Fragment Shader.

J'ai pas compris pourquoi tu as 2 textures par contre.

Code : Tout sélectionner

Shader "EmileF/RotatingTexture"
{
	Properties
	{
		_MainTex("Main Texture", 2D) = "white"{}
		_MainTexRot("Base (RGB)", 2D) = "white" {}
		_Color("Tint Color", Color) = (1,1,1,1)
	}
	SubShader // Rotation
	{
		Pass
		{
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			
			struct v2f
			{
				float2 uv : TEXCOORD0;
				float4 pos : SV_POSITION;
			};

			float4x4 _TextureRotation;
			float4 _Color;
			sampler2D _MainTexRot;
			sampler2D _MainTex;

			v2f vert(float4 pos : POSITION, float2 uv : TEXCOORD0)
			{
				v2f o;
				o.pos = UnityObjectToClipPos(pos);
				o.uv = mul(_TextureRotation, float4(uv,0,1)).xy;
				return o;
			}
			
			//Ici tu fais tes calculs pour renvoyer une couleur finale
			//La je multiplie la texture tournée avec la couleur (du coup je n'utilise pas _MainTex)
			fixed4 frag(v2f i) : SV_Target
			{
				return tex2D(_MainTexRot, i.uv) * _Color;
			}

			ENDCG
		}
	}
}
J'ai pas testé le résultat final, mais ça donner un truc dans le genre.
Tu peux changer le chemin du shader en l'écrivant: Ici il sera sous EmileF/RotatingTexture
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

EmileF
Messages : 673
Inscription : 18 Mars 2017 19:39

Re: Shader avec option Rotation texture

Message par EmileF » 28 Nov 2019 13:04

Salut Boubouk, et grand merci
Boubouk a écrit :J'ai pas compris pourquoi tu as 2 textures par contre.
Moi non plus maintenant et au fur et à mesure des différents essais.....

Voilà le shader final

Code : Tout sélectionner

Shader "Custom/RotColorTexture"
{
	Properties
	{
		_MainTex("Main Texture", 2D) = "white"{}
		_Color("Tint Color", Color) = (1,1,1,1)
	}
	SubShader
	{
		Pass
		{
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			
			struct v2f
			{
				float2 uv : TEXCOORD0;
				float4 pos : SV_POSITION;
			};

			float4x4 _TextureRotation;
			float4 _Color;
			sampler2D _MainTex;

			v2f vert(float4 pos : POSITION, float2 uv : TEXCOORD0)
			{
				v2f o;
				o.pos = UnityObjectToClipPos(pos);
				o.uv = mul(_TextureRotation, float4(uv,0,1)).xy;
				return o;
			}
			
			fixed4 frag(v2f i) : SV_Target
			{
				return tex2D(_MainTex, i.uv) * _Color;
			}

			ENDCG
		}
	}//end subshader

}
Ca marche nickel. Merci Boubouk
Puis-je abuser pour quelques conseils pour ajouter une texture normalMap
La différence entre l'intelligence et la stupidité est que l'intelligence est limitée.

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6186
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Shader avec option Rotation texture

Message par boubouk50 » 28 Nov 2019 13:09

Là c'est la pause midi, je vais manger mais tu peux regarder ce GitHub:
https://gist.github.com/enghqii/eb99185fc029b9eb46fa
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

EmileF
Messages : 673
Inscription : 18 Mars 2017 19:39

Re: Shader avec option Rotation texture

Message par EmileF » 28 Nov 2019 13:38

Je viens de voir, aie, c'est vachement compliqué et carrément illisible pour moi.

Je vais essayé d'approfondir un peu mais bon...

En tout cas, merci Boubouk, bon appétit et bonne sieste :mdr3:
La différence entre l'intelligence et la stupidité est que l'intelligence est limitée.

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6186
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Shader avec option Rotation texture

Message par boubouk50 » 28 Nov 2019 14:31

EmileF a écrit :
28 Nov 2019 13:38
bonne sieste :mdr3:
Où as-tu planqué les caméras, félon! :gene:
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

EmileF
Messages : 673
Inscription : 18 Mars 2017 19:39

Re: Shader avec option Rotation texture

Message par EmileF » 28 Nov 2019 16:24

Boubouk a écrit :Où as-tu planqué les caméras, félon! :gene:
Pas besoin de cameras, à Toulouse c'est comme ça.

Je nage complètement encore.

J'ai récupéré ce shader pour la NormalMap

Code : Tout sélectionner

Shader "Example/Diffuse Bump" {
    Properties {
      _MainTex ("Texture", 2D) = "white" {}
      _BumpMap ("Bumpmap", 2D) = "bump" {}
    }
    SubShader {
      Tags { "RenderType" = "Opaque" }
      CGPROGRAM
      #pragma surface surf Lambert
      struct Input {
        float2 uv_MainTex;
        float2 uv_BumpMap;
      };
      sampler2D _MainTex;
      sampler2D _BumpMap;
      void surf (Input IN, inout SurfaceOutput o) {
        o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb;
        o.Normal = UnpackNormal (tex2D (_BumpMap, IN.uv_BumpMap));
      }
      ENDCG
    } 
    Fallback "Diffuse"
  }
Biensûr, seul il marche bien.

J'ai voulu l'associer à mon shader de rotation:

Code : Tout sélectionner

Shader "Custom/RotColorTexture"
{
	Properties
	{
		_MainTex("Main Texture", 2D) = "white"{}
		_BumpMap("Bumpmap", 2D) = "bump"{}
		_Color("Color", Color) = (1,1,1,1)
	}

		SubShader
		{
			Tags { "RenderType" = "Opaque" }
			CGPROGRAM
			#pragma surface surf Lambert
			#pragma vertex vert
			#pragma fragment frag

			struct Input
			{
				float2 uv_MainTex;
				float2 uv_BumpMap;
			};

			struct v2f
			{
				float2 uv : TEXCOORD0;
				float4 pos : SV_POSITION;
			};


			sampler2D _MainTex;
			sampler2D _BumpMap;
			float4 _Color;
			float4x4 _TextureRotation;

			void surf(Input IN, inout SurfaceOutput o)
			{
				o.Albedo = tex2D(_MainTex, i.uv).rgb * _Color;
				o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
			}

			v2f vert(float4 pos : POSITION, float2 uv : TEXCOORD0)
			{
				v2f o;
				o.pos = UnityObjectToClipPos(pos);
				o.uv = mul(_TextureRotation, float4(uv,0,1)).xy;
				return o;
			}

			fixed4 frag(v2f i) : SV_Target
			{
				return tex2D(_MainTex, i.uv) * _Color;
			}

			ENDCG
		}
		Fallback "Diffuse"

}
J'ai une double erreur à la ligne "CGPROGRAM", qui dit :
Shader error in 'Custom/RotColorTexture': CGPROGRAM cannot contain #pragma surface as well as other programs at line 14

Est-ce que quelqu'un peut m'aider car #pragma surface est aussi avec CGPROGRAM dans le premier shader. Je n'y comprends rien
La différence entre l'intelligence et la stupidité est que l'intelligence est limitée.

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6186
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Shader avec option Rotation texture

Message par boubouk50 » 28 Nov 2019 16:38

Il faut comprendre la structure même des shaders. Ou plutôt les structures.Unity ShaderLab
Tu peux avoir la structure ShaderLab (d'Unity je suppose), les vertex+fragment shader et les surface shaders.
Tu dois donc choisir une de ces structures.
Ici, tu essaies de mélanger les différentes, du coup, ça fait des chocapukes (ce sont des chocapics périmés).
Soit tu restes sur une version vertex + fragment shader (vert frag) comme tu as commencé (mais il me semble que ça nécessite un peu plus de code) ou bien tu changes pour la version surface shader (surf) plutôt utilisé aujourd'hui dans Unity.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6186
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Shader avec option Rotation texture

Message par boubouk50 » 28 Nov 2019 16:49

Je ne sais pas comment tu gères la rotation avec la matrice, mais tu devrais avoir quelque chose comme ça.
Ici, j'utilise 2 jeux d'UVs, mais tu pourrais utiliser le même que celui de la diffuse.

Code : Tout sélectionner

Shader "Custom/RotColorTexture"
{
    Properties
	{
      _MainTex ("Texture", 2D) = "white" {}
      _BumpMap ("Bumpmap", 2D) = "bump" {}
	  _Color ("Color", Color) = (1,1,1,1)
    }

    SubShader
	{
		Tags { "RenderType" = "Opaque" }

		CGPROGRAM
		#pragma surface surf Lambert

		struct Input
		{
			float2 uv_MainTex;
			float2 uv_BumpMap;
		};

		float4 _Color;
		sampler2D _MainTex;
		sampler2D _BumpMap;
		float4x4 _TextureRotation;

		void surf (Input IN, inout SurfaceOutput o)
		{
			//Tourner l'UV de la texture diffuse
			IN.uv_MainTex.xy = mul(_TextureRotation, float4(IN.uv_MainTex,0,1)).xy;
			//Récupérer la texture _MainTex et la multiplier avec la couleur _Color
			o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb * _Color.rgb;
			//Tourner l'UV de la NormalMap
			IN.uv_BumpMap.xy = mul(_TextureRotation, float4(IN.uv_BumpMap,0,1)).xy;
			//Récupérer les normales depuis la NormalMap
			o.Normal = UnpackNormal (tex2D (_BumpMap, IN.uv_BumpMap));
		}
		ENDCG
    }
	Fallback "Diffuse"
}
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

EmileF
Messages : 673
Inscription : 18 Mars 2017 19:39

Re: Shader avec option Rotation texture

Message par EmileF » 28 Nov 2019 17:11

Bouducon,

Ca me fait raller toi en trois lignes tu fais tout alors que ça fait trois jours que je cherche sans résultat.
Boubouk a écrit :Je ne sais pas comment tu gères la rotation avec la matrice
Je pense que tu ne m'as pas marqué ça pour rien car j'ai un défaut que j'ai du mal à comprendre mais qui me parait être dans l'orientation des textures.

Voilà le script qui gère les rotations, tiling et offset

Code : Tout sélectionner

        
        Vector3 pivot = new Vector3(0.5f, 0.5f, 0);
        Vector3 pos = new Vector3(offsetX, offsetY, 0);
        Vector3 tiling = new Vector3(tilingX, tilingY, 1);

        MaterialPropertyBlock block = new MaterialPropertyBlock();
        Matrix4x4 t = Matrix4x4.TRS(-pivot, Quaternion.identity, tiling);
        Quaternion rotation = Quaternion.Euler(0, 0, rot);
        Matrix4x4 r = Matrix4x4.TRS(pivot, rotation, Vector3.one);
        Matrix4x4 tInv = Matrix4x4.TRS(pos, Quaternion.identity, tiling);
        if (texture != null)
        {
            if (normalmap != null)
                block.SetTexture("_BumpMap", normalmap);
            block.SetTexture("_MainTex", texture);
            block.SetMatrix("_TextureRotation", tInv*r*t);
        }
        block.SetColor("_Color", color);
        transform.GetComponent<Renderer>().SetPropertyBlock(block, index);
C'est peut-être là qu'il y a problème.

J'ai modifié ton script pour régler le problème :

Code : Tout sélectionner

			  //Tourner l'UV de la texture diffuse
			  IN.uv_MainTex.xy = mul(_TextureRotation, float4(IN.uv_MainTex,0,1)).xy;
			  //Récupérer la texture _MainTex et la multiplier avec la couleur _Color
			  o.Albedo = tex2D(_MainTex, IN.uv_MainTex).rgb * _Color.rgb;
			  //Tourner l'UV de la NormalMap
			  //IN.uv_BumpMap.xy = mul(_TextureRotation, float4(IN.uv_MainTex,0,1)).xy;
			  //Récupérer les normales depuis la NormalMap
			  o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_MainTex));
mais il se trouve maintenant que le tiling ne marche plus comme il faut, il ne fonctionne que si la rotation est à zéro

Edit:
Ha ça y est, c'est corrigé:
l'erreur etait dans cette ligne:

Code : Tout sélectionner

Matrix4x4 tInv = Matrix4x4.TRS(pos, Quaternion.identity, tiling);
que j'ai modifié ainsi

Code : Tout sélectionner

Matrix4x4 tInv = Matrix4x4.TRS(pos, Quaternion.identity, Vector3.one);
La différence entre l'intelligence et la stupidité est que l'intelligence est limitée.

EmileF
Messages : 673
Inscription : 18 Mars 2017 19:39

Re: Shader avec option Rotation texture

Message par EmileF » 28 Nov 2019 17:45

Pour moi c'est presque parfait

Presque parce que je voudrai ajouter une variable pour régler la hauteur de la normalMap, mais là je pense que ce serait de l'abus. Mais je demande quand même par curiosité.

En tout cas merci à tous les deux, Max et Boubouk, vous êtes les chefs de ce forum.
La différence entre l'intelligence et la stupidité est que l'intelligence est limitée.

Répondre

Revenir vers « les Shaders »