Shader avec option Rotation texture

Questions à propos du scripting Shader.
EmileF
Messages : 673
Inscription : 18 Mars 2017 19:39

Shader avec option Rotation texture

Message par EmileF » 27 Nov 2019 12:45

Bonjour, et bon anniversaire pour vos 10 années de bons et loyaux services

Je voudrais ajouter une option de rotation de texture que le puisse appliquer par script.

J'utilise ce shader qui je crois est la copie du shader standard.

Code : Tout sélectionner

Shader "MyStandard"
{
	Properties
	{
		_Color("Color", Color) = (1,1,1,1)
		_MainTex("Albedo", 2D) = "white" {}

		_Cutoff("Alpha Cutoff", Range(0.0, 1.0)) = 0.5

		_Glossiness("Smoothness", Range(0.0, 1.0)) = 0.5
		_GlossMapScale("Smoothness Scale", Range(0.0, 1.0)) = 1.0
		[Enum(Metallic Alpha,0,Albedo Alpha,1)] _SmoothnessTextureChannel("Smoothness texture channel", Float) = 0

		[Gamma] _Metallic("Metallic", Range(0.0, 1.0)) = 0.0
		_MetallicGlossMap("Metallic", 2D) = "white" {}

		[ToggleOff] _SpecularHighlights("Specular Highlights", Float) = 1.0
		[ToggleOff] _GlossyReflections("Glossy Reflections", Float) = 1.0

		_BumpScale("Scale", Float) = 1.0
		[Normal] _BumpMap("Normal Map", 2D) = "bump" {}

		_Parallax("Height Scale", Range(0.005, 0.08)) = 0.02
		_ParallaxMap("Height Map", 2D) = "black" {}

		_OcclusionStrength("Strength", Range(0.0, 1.0)) = 1.0
		_OcclusionMap("Occlusion", 2D) = "white" {}

		_EmissionColor("Color", Color) = (0,0,0)
		_EmissionMap("Emission", 2D) = "white" {}

		_DetailMask("Detail Mask", 2D) = "white" {}

		_DetailAlbedoMap("Detail Albedo x2", 2D) = "grey" {}
		_DetailNormalMapScale("Scale", Float) = 1.0
		[Normal] _DetailNormalMap("Normal Map", 2D) = "bump" {}

		[Enum(UV0,0,UV1,1)] _UVSec("UV Set for secondary textures", Float) = 0


			// Blending state
			[HideInInspector] _Mode("__mode", Float) = 0.0
			[HideInInspector] _SrcBlend("__src", Float) = 1.0
			[HideInInspector] _DstBlend("__dst", Float) = 0.0
			[HideInInspector] _ZWrite("__zw", Float) = 1.0
	}

		CGINCLUDE
#define UNITY_SETUP_BRDF_INPUT MetallicSetup
			ENDCG


			SubShader
		{
			Tags { "RenderType" = "Opaque" "PerformanceChecks" = "False" }
			LOD 300


			// ------------------------------------------------------------------
			//  Base forward pass (directional light, emission, lightmaps, ...)
			Pass
			{
				Name "FORWARD"
				Tags { "LightMode" = "ForwardBase" }

				Blend[_SrcBlend][_DstBlend]
				ZWrite[_ZWrite]

				CGPROGRAM
				#pragma target 3.0

			// -------------------------------------

			#pragma shader_feature _NORMALMAP
			#pragma shader_feature_local _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
			#pragma shader_feature _EMISSION
			#pragma shader_feature_local _METALLICGLOSSMAP
			#pragma shader_feature_local _DETAIL_MULX2
			#pragma shader_feature_local _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
			#pragma shader_feature_local _SPECULARHIGHLIGHTS_OFF
			#pragma shader_feature_local _GLOSSYREFLECTIONS_OFF
			#pragma shader_feature_local _PARALLAXMAP

			#pragma multi_compile_fwdbase
			#pragma multi_compile_fog
			#pragma multi_compile_instancing
			// Uncomment the following line to enable dithering LOD crossfade. Note: there are more in the file to uncomment for other passes.
			//#pragma multi_compile _ LOD_FADE_CROSSFADE

			#pragma vertex vertBase
			#pragma fragment fragBase
			#include "UnityStandardCoreForward.cginc"

			ENDCG
		}
			// ------------------------------------------------------------------
			//  Additive forward pass (one light per pass)
			Pass
			{
				Name "FORWARD_DELTA"
				Tags { "LightMode" = "ForwardAdd" }
				Blend[_SrcBlend] One
				Fog { Color(0,0,0,0) } // in additive pass fog should be black
				ZWrite Off
				ZTest LEqual

				CGPROGRAM
				#pragma target 3.0

			// -------------------------------------


			#pragma shader_feature _NORMALMAP
			#pragma shader_feature_local _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
			#pragma shader_feature_local _METALLICGLOSSMAP
			#pragma shader_feature_local _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
			#pragma shader_feature_local _SPECULARHIGHLIGHTS_OFF
			#pragma shader_feature_local _DETAIL_MULX2
			#pragma shader_feature_local _PARALLAXMAP

			#pragma multi_compile_fwdadd_fullshadows
			#pragma multi_compile_fog
			// Uncomment the following line to enable dithering LOD crossfade. Note: there are more in the file to uncomment for other passes.
			//#pragma multi_compile _ LOD_FADE_CROSSFADE

			#pragma vertex vertAdd
			#pragma fragment fragAdd
			#include "UnityStandardCoreForward.cginc"

			ENDCG
		}
			// ------------------------------------------------------------------
			//  Shadow rendering pass
			Pass {
				Name "ShadowCaster"
				Tags { "LightMode" = "ShadowCaster" }

				ZWrite On ZTest LEqual

				CGPROGRAM
				#pragma target 3.0

			// -------------------------------------


			#pragma shader_feature_local _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
			#pragma shader_feature_local _METALLICGLOSSMAP
			#pragma shader_feature_local _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
			#pragma shader_feature_local _PARALLAXMAP
			#pragma multi_compile_shadowcaster
			#pragma multi_compile_instancing
			// Uncomment the following line to enable dithering LOD crossfade. Note: there are more in the file to uncomment for other passes.
			//#pragma multi_compile _ LOD_FADE_CROSSFADE

			#pragma vertex vertShadowCaster
			#pragma fragment fragShadowCaster

			#include "UnityStandardShadow.cginc"

			ENDCG
		}
			// ------------------------------------------------------------------
			//  Deferred pass
			Pass
			{
				Name "DEFERRED"
				Tags { "LightMode" = "Deferred" }

				CGPROGRAM
				#pragma target 3.0
				#pragma exclude_renderers nomrt


			// -------------------------------------

			#pragma shader_feature _NORMALMAP
			#pragma shader_feature_local _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
			#pragma shader_feature _EMISSION
			#pragma shader_feature_local _METALLICGLOSSMAP
			#pragma shader_feature_local _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
			#pragma shader_feature_local _SPECULARHIGHLIGHTS_OFF
			#pragma shader_feature_local _DETAIL_MULX2
			#pragma shader_feature_local _PARALLAXMAP

			#pragma multi_compile_prepassfinal
			#pragma multi_compile_instancing
			// Uncomment the following line to enable dithering LOD crossfade. Note: there are more in the file to uncomment for other passes.
			//#pragma multi_compile _ LOD_FADE_CROSSFADE

			#pragma vertex vertDeferred
			#pragma fragment fragDeferred

			#include "UnityStandardCore.cginc"

			ENDCG
		}

			// ------------------------------------------------------------------
			// Extracts information for lightmapping, GI (emission, albedo, ...)
			// This pass it not used during regular rendering.
			Pass
			{
				Name "META"
				Tags { "LightMode" = "Meta" }

				Cull Off

				CGPROGRAM
				#pragma vertex vert_meta
				#pragma fragment frag_meta

				#pragma shader_feature _EMISSION
				#pragma shader_feature_local _METALLICGLOSSMAP
				#pragma shader_feature_local _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
				#pragma shader_feature_local _DETAIL_MULX2
				#pragma shader_feature EDITOR_VISUALIZATION

				#include "UnityStandardMeta.cginc"
				ENDCG
			}
		}

			SubShader
		{
			Tags { "RenderType" = "Opaque" "PerformanceChecks" = "False" }
			LOD 150

			// ------------------------------------------------------------------
			//  Base forward pass (directional light, emission, lightmaps, ...)
			Pass
			{
				Name "FORWARD"
				Tags { "LightMode" = "ForwardBase" }

				Blend[_SrcBlend][_DstBlend]
				ZWrite[_ZWrite]

				CGPROGRAM
				#pragma target 2.0

				#pragma shader_feature _NORMALMAP
				#pragma shader_feature_local _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
				#pragma shader_feature _EMISSION
				#pragma shader_feature_local _METALLICGLOSSMAP
				#pragma shader_feature_local _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
				#pragma shader_feature_local _SPECULARHIGHLIGHTS_OFF
				#pragma shader_feature_local _GLOSSYREFLECTIONS_OFF
			// SM2.0: NOT SUPPORTED shader_feature_local _DETAIL_MULX2
			// SM2.0: NOT SUPPORTED shader_feature_local _PARALLAXMAP

			#pragma skip_variants SHADOWS_SOFT DIRLIGHTMAP_COMBINED

			#pragma multi_compile_fwdbase
			#pragma multi_compile_fog

			#pragma vertex vertBase
			#pragma fragment fragBase
			#include "UnityStandardCoreForward.cginc"

			ENDCG
		}
			// ------------------------------------------------------------------
			//  Additive forward pass (one light per pass)
			Pass
			{
				Name "FORWARD_DELTA"
				Tags { "LightMode" = "ForwardAdd" }
				Blend[_SrcBlend] One
				Fog { Color(0,0,0,0) } // in additive pass fog should be black
				ZWrite Off
				ZTest LEqual

				CGPROGRAM
				#pragma target 2.0

				#pragma shader_feature _NORMALMAP
				#pragma shader_feature_local _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
				#pragma shader_feature_local _METALLICGLOSSMAP
				#pragma shader_feature_local _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
				#pragma shader_feature_local _SPECULARHIGHLIGHTS_OFF
				#pragma shader_feature_local _DETAIL_MULX2
			// SM2.0: NOT SUPPORTED shader_feature_local _PARALLAXMAP
			#pragma skip_variants SHADOWS_SOFT

			#pragma multi_compile_fwdadd_fullshadows
			#pragma multi_compile_fog

			#pragma vertex vertAdd
			#pragma fragment fragAdd
			#include "UnityStandardCoreForward.cginc"

			ENDCG
		}
			// ------------------------------------------------------------------
			//  Shadow rendering pass
			Pass {
				Name "ShadowCaster"
				Tags { "LightMode" = "ShadowCaster" }

				ZWrite On ZTest LEqual

				CGPROGRAM
				#pragma target 2.0

				#pragma shader_feature_local _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
				#pragma shader_feature_local _METALLICGLOSSMAP
				#pragma shader_feature_local _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
				#pragma skip_variants SHADOWS_SOFT
				#pragma multi_compile_shadowcaster

				#pragma vertex vertShadowCaster
				#pragma fragment fragShadowCaster

				#include "UnityStandardShadow.cginc"

				ENDCG
			}

			// ------------------------------------------------------------------
			// Extracts information for lightmapping, GI (emission, albedo, ...)
			// This pass it not used during regular rendering.
			Pass
			{
				Name "META"
				Tags { "LightMode" = "Meta" }

				Cull Off

				CGPROGRAM
				#pragma vertex vert_meta
				#pragma fragment frag_meta

				#pragma shader_feature _EMISSION
				#pragma shader_feature_local _METALLICGLOSSMAP
				#pragma shader_feature_local _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
				#pragma shader_feature_local _DETAIL_MULX2
				#pragma shader_feature EDITOR_VISUALIZATION

				#include "UnityStandardMeta.cginc"
				ENDCG
			}
		}

J'ai trouvé ce shader, avec lequel je peux appliquer une rotation à ma texture

Code : Tout sélectionner

Shader "RotatingTexture"
{
	Properties
	{
		_MainTex("Base (RGB)", 2D) = "white" {}
	}
		SubShader
	{
		Pass
		{
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag

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

			float4x4 _TextureRotation;

			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;
			}

			sampler2D _MainTex;
			fixed4 frag(v2f i) : SV_Target
			{
				return tex2D(_MainTex, i.uv);
			}
			ENDCG
		}
	}
}
Ca marche mais je n'ai plus que cette option. Il m'enlève toutes les autres options de couleur, de tiling ou offset auquelles j'avais accès dans mon script.

J'ai essayé de combiner les 2 shaders afin d'ajouter l'option de rotation mais je n'y suis pas arrivé.
Est-ce que quelqu'un peut m' aider
La différence entre l'intelligence et la stupidité est que l'intelligence est limitée.

Avatar de l’utilisateur
Max
Messages : 8763
Inscription : 30 Juil 2011 13:57
Contact :

Re: Shader avec option Rotation texture

Message par Max » 27 Nov 2019 19:14

Hello,
EmileF a écrit :
27 Nov 2019 12:45
Je voudrais ajouter une option de rotation de texture que le puisse appliquer par script.
C'est un besoin bien particulier ce genre de chose. Tu cherches à faire quoi précisément ?
EmileF a écrit :
27 Nov 2019 12:45
Ca marche mais je n'ai plus que cette option. Il m'enlève toutes les autres options de couleur, de tiling ou offset auquelles j'avais accès dans mon script.
Il y a quelques autres ressources sur le net. Par exemple ici, cela te conviendrait peut-être mieux (peut-être plus facile à adpater à tes besoins).
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

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

Re: Shader avec option Rotation texture

Message par EmileF » 27 Nov 2019 19:55

Salut Max

Je suis en train de créer un jeu genre Escape Game.
Pour mes décors je crée des objets de base sur Blender, que je peaufine ensuite sur Unity.
Pour cela je me suis fait un petit script me permettant d'appliquer mes textures et les mettre au format du mur par exemple grâce au fonction Tiling et OffSet, et je modifie la couleur selon mes désirs, au lieu de créer un matérial par morceau de mur. Ca me permet d'adapter mes objets de base à ma scène au lieu de créer un objet différent à chaque fois sur Blender.

Il se trouve que par exemple pour texturer un mur de briques, mes briques sont verticales, mais pas sur tous les murs, ou pour orienter les fibres de bois par exemple, j'ai besoin de faire pivoter ma texture.

J'ai déjà vu la ressource que tu me proposes, hé bien d'autre même, mais à chaque fois, le shader proposé ne traite que la rotation, et je n'arrive pas à créer un shader un peu plus complet pour regrouper toutes les options à savoir, le Tiling, l'Offset, la couleur et aussi le NormalMap avec la possibilité de rotation.

Et je ne connais rien au shader et les tutos que j'ai pu voir pour le moment sur la création de shader sont pour moi en hébreu. Je pense qu'il va me falloir me pencher d'avantage dessus. Si tu as un conseil à me donner la dessus, ce serait avec plaisir.

En tout cas merci de ta réponse.
La différence entre l'intelligence et la stupidité est que l'intelligence est limitée.

Avatar de l’utilisateur
Max
Messages : 8763
Inscription : 30 Juil 2011 13:57
Contact :

Re: Shader avec option Rotation texture

Message par Max » 27 Nov 2019 20:49

Ouep, tu ne te traces pas un chemin facile :mrgreen:

Sinon, mixer rotation + tiling + offset, pas évident.
Sur l'exemple que tu donnes plus haut, avec la matrice float4x4 _TextureRotation, as tu essayé de passer par une fonction du genre Matrix4x4.TRS(position, rotation, scale) ?
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

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

Re: Shader avec option Rotation texture

Message par EmileF » 27 Nov 2019 21:56

Non,

Ces shaders sont des shaders que j'ai récupéré sur le net, je ne les ai pas construit

J'ai essayé ce que tu m'as proposé, mais ça me modifie le mesh, sa taille, sa position et sa rotation. Et ça ne marche qu'en mode play.

C'est la texture que je veux modifier, et en mode Edit en plus, j'avais oublié de le préciser. Je ne veux pas toucher au mesh

Je cherche toujours
La différence entre l'intelligence et la stupidité est que l'intelligence est limitée.

Avatar de l’utilisateur
Max
Messages : 8763
Inscription : 30 Juil 2011 13:57
Contact :

Re: Shader avec option Rotation texture

Message par Max » 27 Nov 2019 22:01

EmileF a écrit :
27 Nov 2019 21:56
J'ai essayé ce que tu m'as proposé, mais ça me modifie le mesh, sa taille, sa position et sa rotation. Et ça ne marche qu'en mode play.
heu non, il faut passer par mat.SetMatrix("_TextureRotation", maMatrice); pour attaquer ton shader. Tu as bien du le faire puisque dans ton message initial tu dis que tu as essayé ce shader et qu'il marche pour ce qui est de la rotation des textures.
EmileF a écrit :
27 Nov 2019 21:56
et en mode Edit en plus
exigent en plus :mrgreen:
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

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

Re: Shader avec option Rotation texture

Message par EmileF » 27 Nov 2019 22:17

Aye,

Le shader au début n'utilise pas les matrices si?
La différence entre l'intelligence et la stupidité est que l'intelligence est limitée.

Avatar de l’utilisateur
Max
Messages : 8763
Inscription : 30 Juil 2011 13:57
Contact :

Re: Shader avec option Rotation texture

Message par Max » 27 Nov 2019 22:21

EmileF a écrit :
27 Nov 2019 22:17
Le shader au début n'utilise pas les matrices si?
ben si:

Code : Tout sélectionner

Shader "RotatingTexture"
{
	Properties
	{
		_MainTex("Base (RGB)", 2D) = "white" {}
	}
...

			float4x4 _TextureRotation;
...
}
D'ailleurs il me semble bien que c'est le shader donné en exemple dans la doc de Material.SetMatrix.
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

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

Re: Shader avec option Rotation texture

Message par EmileF » 27 Nov 2019 22:42

Oui, oui, oui, pardon, je suis un peu largué et j'ai la comprenante un peu longue.

Mais ça marche pour le tiling, l'offset et la rotation et en mode Edit.

Juste un petit détail me manque, la couleur, un petit tuyau la dessus peut-être, si ce n'est pas trop abusé.
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 12:29

Voilà ou j'en suis,

J'ai essayé de regrouper 2 shaders que j'ai pompé sur internet afin de cumuler les options de rotation et de couleur.

Voilà le script:

Code : Tout sélectionner

Shader "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;

			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;
			}
			
			sampler2D _MainTexRot;
			fixed4 frag(v2f i) : SV_Target
			{
				return tex2D(_MainTexRot, i.uv);
			}

			ENDCG
		}
	}//end subshader


	SubShader // Color
	{

		Tags { "Queue" = "Transparent" }

		Pass
		{
			ZWrite On
			ColorMask 0
		}

		Pass
		{
			SetTexture[_MainTex]
			{
				constantColor[_Color]
				combine texture * constant
			}
		}
	}//end subshader
}
Je me retrouve avec selon la position des SubShaders, (avant ou après l'autre) dans le cas ou c'est le premier Shader qui fonctionne.

J'ai aussi essayé de regrouper les 2 SubShaders . La c'est seulement le 2ème Shader qui fonctionne.

Comment puis-je faire pour qu'ils fonctionnent tous les 2 ?
La différence entre l'intelligence et la stupidité est que l'intelligence est limitée.

Répondre

Revenir vers « les Shaders »