- Home /
Creating a particle system that uses 1 draw call
I'm currently working on making a particle system however currently I am placing multiple quads in my scene and applying the same shader to all of them to get my effect. This uses 1 draw call but requires the rest of the quads to be batched. I would like to create a system that uses 1 draw call and no batching.
I'm aware some techniques exist (such as instancing) that would allow me to draw multiple geometries with one shader but I'm not too sure how to do that.
Any help would be appreciated
Here's my code :
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.1
_Fader ("Fade Point", Range (0,1)) = 0.9
_Position ("World Position", Vector) = (0,0,0,0)
}
Category
{
Tags { "Queue" = "Transparent" }
Blend SrcAlpha OneMinusSrcAlpha
ZWrite Off
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 += _Position;
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
}
}
}
}
Comment