# Unity LineRenderer custom reapeted Texture with margin

I have a LineRenderer, which has 1 dot as texture, which is repeated over the whole line. Now I want to know, if there is some way to give this dots a margin, so that I can make the gap between them bigger.

For the moment there is no gap, I could make a new Texture and add the margin there, but I hope for some more dynamic way to do this.

Edit: Inspector View :

• could you paste a screenshot of your inspector for this line renderer? I just get one stretched texture on a line. How do you do it? – Nika Kasradze Mar 29 '16 at 11:34
• Done, but I guess that won't help much, but here is a thread which should contain all you need : gamedev.stackexchange.com/questions/118814/… – TobiasW Mar 29 '16 at 11:57

If all you need are dots, I wouldn't even use a texture for this. We can shape a repeated circular zone to our liking within the shader:

By playing with the Repeat Count and Spacing material parameters, you can change the number & spacing of the dots. Offset will shift the dot pattern along the line.

Here's the shader I wrote for this:

Shader "Unlit/DottedLineShader"
{
Properties
{
_RepeatCount("Repeat Count", float) = 5
_Spacing("Spacing", float) = 0.5
_Offset("Offset", float) = 0
}
{
Tags { "RenderType" = "Transparent" "Queue" = "Transparent" }
LOD 100

Blend SrcAlpha OneMinusSrcAlpha
ZWrite Off

Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag

#include "UnityCG.cginc"

float _RepeatCount;
float _Spacing;
float _Offset;

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

struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
fixed4 color : COLOR0;
};

v2f vert (appdata v)
{
v2f o;
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
o.uv = v.uv;
o.uv.x = (o.uv.x + _Offset) * _RepeatCount * (1.0f + _Spacing);
o.color = v.color;

return o;
}

fixed4 frag (v2f i) : SV_Target
{
i.uv.x = fmod(i.uv.x, 1.0f + _Spacing);
float r = length(i.uv - float2(1.0f + _Spacing, 1.0f) * 0.5f) * 2.0f;

fixed4 color = i.color;
color.a *= saturate((0.99f - r) * 100.0f);

return color;
}
ENDCG
}
}
}


One little issue: in my test scene this gets rendered behind the skybox. I'm used to "Queue"="Transparent" fixing that, so I may have something else a little off in here, but I don't have time to debug right now. If it poses a problem for you, you can make the dots alpha tested instead of blended as a quick & dirty fix.

• Okay this works pretty good, but is there a possibility to set the scale? Because depending on the length of the line, the dots are getting oval, I could fix this issue for the texture with this: line.material.SetTextureScale(....). But this is not working anymore. – TobiasW Mar 29 '16 at 12:41
• Instead you'd use line.material.SetFloat("_RepeatCount", foo); where foo is a float describing your desired number of dots. You can also cache the property ID from Shader.PropertyToID and use the integer version of Material.SetFloat if you're using it a lot. – DMGregory Mar 29 '16 at 12:50
• Okay, so I can still not increase the gap between the dots right? I mean I can lower the amount of the dots but then I will get ovals. And is there an easy way to make the offset work here? Sorry I'm completely new to shaders :/ – TobiasW Mar 29 '16 at 12:56
• Yeah obviously, but I would like to keep the dot size and increase the gap at the same time, would that be possible? And the offset part was nice to "animate" the dots, since I was able to constantly increase the offset so the dots were flowing along the line. – TobiasW Mar 29 '16 at 13:24
• @Thunder updated with requested parameters – DMGregory Mar 29 '16 at 13:31