Répéter un motif en intercalant un espace entre chaque occurrence

Questions à propos du scripting Shader.
ticoel
Messages : 20
Inscription : 21 Juin 2017 13:31

Répéter un motif en intercalant un espace entre chaque occurrence

Message par ticoel » 06 Sep 2017 17:39

Bonjour,
J'essaye de réaliser une fonction de téléportation pour se déplacer en VR à l'aide d'Unity. J'ai déjà réalisé toute la mécanique, et je peux me téléporter au sein de l’environnement. Maintenant, j'essaye de rendre cela joli en essayant d'ajouter la texture de ma parabole qui est dessinée à l'aide d'un lineRenderer dont les points sont recalculés en temps réel.

Pour ceci, je voudrais réaliser un shader qui prend en entrée une texture et certains paramètres afin de répéter un motif en y intercalant un espace entre chacun. Je découvre les shaders, j'ai beaucoup de mal à imaginer une solution bien que j'ai déjà trouvé ça sans arriver à trop comprendre pour l'adapter à mon problème.

Comment faire un shader qui répète une texture en espaçant chaque occurrence d'une certaine distance ?

J'ai déjà ça. C'est le template par défaut, sur lequel j'ai ajouté la prise en compte des couleurs du LineRenderer.

Code : Tout sélectionner

// Définit le nom du shader
Shader "Unlit/Arrow"
{
	Properties
	{
		// Définit une variable utilisable dans le shader
		_MainTex ("Texture", 2D) = "white" {}
	}

	SubShader
	{
		// Définit l'ordre de traitement
		Tags { "RenderType"="Transparent" }
		// Ignore les objets dont le LOD est suppérieur
		LOD 100

		Pass
		{
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			// make fog work
			#pragma multi_compile_fog
			
			#include "UnityCG.cginc"

			// Définit une structure de donnée utilisée entre la carte graphique et l'application 
			struct appdata
			{
				float4 vertex : POSITION;
				float2 uv : TEXCOORD0;
				fixed4 color : COLOR0;
			};

			// Définit une structure de donnée utilisée entre le vertex shader et le fragment shader
			struct v2f
			{
				float2 uv : TEXCOORD0;
				UNITY_FOG_COORDS(1)
				float4 vertex : SV_POSITION;
				fixed4 color : COLOR0;
			};

			//
			sampler2D _MainTex;
			float4 _MainTex_ST;
			
			// Manipule les sommets du modèle à afficher
			v2f vert (appdata v)
			{
				v2f o;
				o.vertex = UnityObjectToClipPos(v.vertex);
				o.uv = TRANSFORM_TEX(v.uv, _MainTex);
				o.color = v.color;
				return o;
			}
			
			// Définit la sortie du shader (couleur et emplacement)
			fixed4 frag (v2f i) : SV_Target
			{
				// sample the texture
				fixed4 color = (tex2D(_MainTex, i.uv) + i.color) / 2;
				// apply fog
				UNITY_APPLY_FOG(i.fogCoord, color);
				return color;
			}
			ENDCG
		}
	}
}
Merci pour votre aide.

ticoel
Messages : 20
Inscription : 21 Juin 2017 13:31

Re: Répéter un motif en intercalant un espace entre chaque occurrence

Message par ticoel » 07 Sep 2017 22:24

Bonsoir,

J'ai avancé sur le shader sans savoir comment prendre en compte l'offset et une distance de séparation. Si vous avez des pistes !!

Mon shader actuel :

Code : Tout sélectionner

Shader "Unlit/ArcRenderer"
{
	Properties
	{
		_MainTex ("Texture", 2D) = "white" {}
		_Speed("Speed", float) = 1.0
	}

	SubShader
	{
		Tags { "RenderType"="Transparent" "Queue"="Transparent" }
		LOD 100

		Cull Off
		ZWrite Off
		Blend SrcAlpha OneMinusSrcAlpha

		Pass
		{
			CGPROGRAM
				#pragma vertex vert
				#pragma fragment frag
				#pragma multi_compile_fog
			
				#include "UnityCG.cginc"

				struct appdata
				{
					float4 vertex : POSITION;
					float2 uv : TEXCOORD0;
					fixed4 color : COLOR0;
				};

				struct v2f
				{
					float2 uv : TEXCOORD0;
					UNITY_FOG_COORDS(1)
					float4 vertex : SV_POSITION;
					fixed4 color : COLOR0;
				};

				sampler2D _MainTex;
				float4 _MainTex_ST;
				half _Speed;
				
				v2f vert (appdata v)
				{
					v2f o;
					o.vertex = UnityObjectToClipPos(v.vertex);
					o.uv = TRANSFORM_TEX(v.uv, _MainTex);
					o.uv.x += _Time.y * _Speed * -1;
					UNITY_TRANSFER_FOG(o,o.vertex);
					o.color = v.color;
					return o;
				}
				
				fixed4 frag(v2f i) : SV_Target
				{
					fixed4 color = i.color * tex2D(_MainTex, i.uv);
					UNITY_APPLY_FOG(i.fogCoord, color);
					return color;
				}
			ENDCG
		}
	}
}

Répondre

Revenir vers « les Shaders »