Passing a position multiple times into a shader in unity,passing a position multiple times into a shader in unity?
I am trying to create a track in unity by using nodes, this works however to show the track i am trying to use a shader that changes the textures at the position of the node. This how ever only chnages the texture for the first node and then stops. is this a shader limitation or am i missing something?
Shader code:
Properties { _NodePos("Node position", vector) = (0.0, 0.0, 0.0, 0.0) _Dist("Distance", float) = 5.0 _MainTex("Texture", 2D) = "white" {} _SecondayTex("Secondary texture", 2D) = "white"{} _NumOfPeices("Pieces",float) = 5.0 _Color("colour", Color) = (1,1,1,0.5) _isdone("isdone",float) = 0.0 } SubShader { Tags { "RenderType" = "Opaque" }
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma target 4.0
#include "UnityCG.cginc"
struct v2f {
float4 pos : SV_POSITION;
float2 uv : TEXCOORD0;
float4 worldPos : TEXCOORD1;
};
v2f vert(appdata_base v)
{
v2f o;
// We compute the world position to use it in the fragment function
o.worldPos = mul(unity_ObjectToWorld, v.vertex);
o.pos = UnityObjectToClipPos(v.vertex);
o.uv = v.texcoord;
return o;
}
uniform float4 _Color;
float4 _NodePos;
sampler2D _MainTex;
sampler2D _SecondayTex;
float _Dist;
float _NumOfPeices;
float _isdone;
fixed4 frag(v2f i) : SV_Target
{
// Depending on the distance from the player, we use a different texture
if (distance(_NodePos.xyz, i.worldPos.xyz) < _Dist)
{
return tex2D(_SecondayTex, i.uv);
}
else
return tex2D(_MainTex, i.uv);
}
ENDCG
}
}
Script code to give the position:
public void createDirtTrack() { foreach (NodeScript n in GD.path) { if (GD.path.Contains(n)) {
Mat.SetVector("_NodePos", n.worldPos);
Mat.SetFloat("_Dist", Radius);
}
}}
Final result in the unity scene: enter image description here
Any help would be greatly appreciated,I am trying to create a track in unity by using nodes, this works however to show the track i am trying to use a shader that changes the textures at the position of the node. This how ever only chnages the texture for the first node and then stops. is this a shader limitation or am i missing something?
Shader code:
Properties { _NodePos("Node position", vector) = (0.0, 0.0, 0.0, 0.0) _Dist("Distance", float) = 5.0 _MainTex("Texture", 2D) = "white" {} _SecondayTex("Secondary texture", 2D) = "white"{} _NumOfPeices("Pieces",float) = 5.0 _Color("colour", Color) = (1,1,1,0.5) _isdone("isdone",float) = 0.0 } SubShader { Tags { "RenderType" = "Opaque" }
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma target 4.0
#include "UnityCG.cginc"
struct v2f {
float4 pos : SV_POSITION;
float2 uv : TEXCOORD0;
float4 worldPos : TEXCOORD1;
};
v2f vert(appdata_base v)
{
v2f o;
// We compute the world position to use it in the fragment function
o.worldPos = mul(unity_ObjectToWorld, v.vertex);
o.pos = UnityObjectToClipPos(v.vertex);
o.uv = v.texcoord;
return o;
}
uniform float4 _Color;
float4 _NodePos;
sampler2D _MainTex;
sampler2D _SecondayTex;
float _Dist;
float _NumOfPeices;
float _isdone;
fixed4 frag(v2f i) : SV_Target
{
// Depending on the distance from the player, we use a different texture
if (distance(_NodePos.xyz, i.worldPos.xyz) < _Dist)
{
return tex2D(_SecondayTex, i.uv);
}
else
return tex2D(_MainTex, i.uv);
}
ENDCG
}
}
Script code to give the position:
public void createDirtTrack() { foreach (NodeScript n in GD.path) { if (GD.path.Contains(n)) {
Mat.SetVector("_NodePos", n.worldPos);
Mat.SetFloat("_Dist", Radius);
}
}}
Final result in the unity scene: enter image description here
Any help would be greatly appreciated