- Home /
Accessing shader property breaks shader
Hi there I'm making a basic particle effect shader and would like to pass the position of my particle effect emmitter to the shader. I'm doing this via a script :
using UnityEngine;
using System.Collections;
public class ParticleEmitterScript : MonoBehaviour
{
public GameObject emitter;
// Use this for initialization
void Start ()
{
gameObject.renderer.material.SetVector("_Position", new Vector4(0,0,0,0));
}
// Update is called once per frame
void Update () {
}
}
However when I attach this script my shader stops working as it should. If I attach this script to all particles in my system all particles will follow one path.
Here is my shader :
Shader "Custom/ParticleShader"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_Speed ("Particle Speed", Range (0,10)) = 0.5
_Height ("Particle Height", Range (0,100)) = 80
_ParticleSpread ("Particle Spread", Range (0,100)) = 20
_ParticleSize ("Particle Size", Range (0,10)) = 7.8
_ParticleSystemShape ("System Shape", Range (0,10)) = 1
_Cutoff ("Cut Off", Range (0,1)) = 0.5
_Fader ("Fade Point", Range (0,1)) = 0.9
_Position ("World Position", Vector) = (0,0,0,0)
}
Category
{
Tags { "Queue" = "Transparent" }
Blend SrcAlpha OneMinusSrcAlpha
AlphaTest Greater .01
ColorMask RGB
Cull Off Lighting Off ZWrite Off Fog { Color (0,0,0,0) }
SubShader
{
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
sampler2D _MainTex;
float4 _Position;
float _Speed;
float _Height;
float _ParticleSpread;
float _ParticleSize;
float _ParticleSystemShape;
float _Cutoff;
float _Fader;
struct v2f {
float4 pos : SV_POSITION;
float color : COLOR0;
float2 uv : TEXCOORD0;
};
float4 _MainTex_ST;
v2f vert (appdata_base v)
{
float t = frac(v.vertex.z + _Speed * _Time);
float s = pow(t, _ParticleSystemShape);
float3 eyeVector = ObjSpaceViewDir( v.vertex );
float3 upVector = float3(0,1,0);
float3 sideVector = normalize(cross(eyeVector,upVector));
v2f o;
o.pos = v.vertex;
o.pos.x = _ParticleSpread * s * sin(62.0 * v.vertex.z);
o.pos.z = _ParticleSpread * s * cos(163.0 * v.vertex.z);
o.pos.y = _Height * t;
o.pos.xyz += _ParticleSize * (v.vertex.x * sideVector + v.vertex.y * upVector).xyz;
o.pos = mul (UNITY_MATRIX_VP, o.pos);
o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
o.color = _Fader - t;
return o;
}
float4 frag (v2f i) : COLOR
{
float4 texcol = tex2D(_MainTex, i.uv);
if(texcol.a < _Cutoff)
{
discard;
}
return i.color * texcol;
}
ENDCG
}
}
}
}
Any help would be appreciated
Comment