Page 2 sur 3

Re: Shader avec option Rotation texture

Publié : 28 Nov 2019 12:44
par boubouk50
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

Re: Shader avec option Rotation texture

Publié : 28 Nov 2019 13:04
par EmileF
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

Re: Shader avec option Rotation texture

Publié : 28 Nov 2019 13:09
par boubouk50
Là c'est la pause midi, je vais manger mais tu peux regarder ce GitHub:
https://gist.github.com/enghqii/eb99185fc029b9eb46fa

Re: Shader avec option Rotation texture

Publié : 28 Nov 2019 13:38
par EmileF
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:

Re: Shader avec option Rotation texture

Publié : 28 Nov 2019 14:31
par boubouk50
EmileF a écrit :
28 Nov 2019 13:38
bonne sieste :mdr3:
Où as-tu planqué les caméras, félon! :gene:

Re: Shader avec option Rotation texture

Publié : 28 Nov 2019 16:24
par EmileF
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

Re: Shader avec option Rotation texture

Publié : 28 Nov 2019 16:38
par boubouk50
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.

Re: Shader avec option Rotation texture

Publié : 28 Nov 2019 16:49
par boubouk50
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"
}

Re: Shader avec option Rotation texture

Publié : 28 Nov 2019 17:11
par EmileF
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);

Re: Shader avec option Rotation texture

Publié : 28 Nov 2019 17:45
par EmileF
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.