Aetheria/Assets/Plugins/GPUTrail/Sample/GPUTrailIndirectSample/GPUTrailIndirectSampleParticleCS.compute
Reinier Vens bb297bf84c Lightning
Created Lightning Gun effect (Uses LineRenderer, very slow)
Created GPU Lightning renderer (very fast, still needs integration)
2021-02-04 04:37:47 +00:00

56 lines
1.3 KiB
Text

#pragma kernel CSMain
#define NUM_THREAD_X 16
struct Particle
{
float3 velocity;
float3 pos;
};
float _Time;
float _ForceRate;
float _Damping;
float _Gravity;
float3 _Bounds;
RWStructuredBuffer<Particle> _ParticleBuffer;
RWStructuredBuffer<float3> _InputBuffer;
float rand(float2 co){
return frac(sin(dot(co.xy ,float2(12.9898,78.233))) * 43758.5453);
}
[numthreads(NUM_THREAD_X,1,1)]
void CSMain (uint3 id : SV_DispatchThreadID)
{
uint idx = id.x;
Particle particle = _ParticleBuffer[idx];
float3 force = float3 (
rand(float2(idx, _Time )) - 0.5,
rand(float2(idx, _Time*2)) - 0.5,
rand(float2(idx, _Time*3)) - 0.5
);
float3 velocity = particle.velocity * _Damping + force * _ForceRate;
velocity.y -= _Gravity;
float3 pos = particle.pos + velocity;
float3 overPlus = pos - _Bounds;
if ( overPlus.x > 0) { pos.x = _Bounds.x; velocity.x *= -0.95;}
if ( overPlus.y > 0) { pos.y = _Bounds.y; velocity.y *= -0.95;}
if ( overPlus.z > 0) { pos.z = _Bounds.z; velocity.z *= -0.95;}
float3 overMinus = pos + _Bounds;
if ( overMinus.x < 0){ pos.x = -_Bounds.x; velocity.x *= -0.95;}
if ( overMinus.y < 0){ pos.y = -_Bounds.y; velocity.y *= -0.95;}
if ( overMinus.z < 0){ pos.z = -_Bounds.z; velocity.z *= -0.95;}
particle.pos = pos;
particle.velocity = velocity;
_ParticleBuffer[idx] = particle;
_InputBuffer[idx] = particle.pos;
}