Hello,
I'm having a bit of trouble implementing a fully GPU based particle system. I've implemented the one similar to what's presented in J. Zink's book and it works fine for 99% of the time. The problem is that some of the particles seem to get stuck: they don't move forward along their given direction vector and flicker for a couple of frames and then suddenly jump forward again. I'm not sure as to what could cause this kind of behavior.
In the following shaders, particleCount is from a constant buffer that gets updated with the CopyStructureCount method from the UAV holding the newest data.
The update shader:
[numthreads(512, 1, 1)]
void CSMain(uint3 dispatchThreadID : SV_DispatchThreadID) {
uint threadID = dispatchThreadID.x + dispatchThreadID.y * 512 * dispatchThreadID.z * 512 * 512;
if(threadID < particleCount) {
Particle p = oldState.Consume();
p.velocity += acceleration * dt;
p.position += p.velocity * dt;
p.time += dt;
if(p.time < particleLifetime) {
newState.Append(p);
}
}
}
The particle adding shader:
[numthreads(1, 1, 1)]
void CSMain(uint3 dispatchThreadID : SV_DispatchThreadID) {
if(particleCount < 512) {
Particle p;
p.position = position.xyz;
p.velocity = velocity.xyz;
p.time = 0.0f;
particles.Append(p);
}
}
Checking with NSight, the particleCount stays at 512 all the time. If I swap the order of operations to Update(); Add();, the value for the constant buffer before update is 512 and after is 513 (i.e. buffer overflow). However, when I use the Add(); Update(); order they seem to be the same.
I'd submit a screenshot of what's happening but it's really difficult to capture since the particles are stuck for about 1-2s, sometimes less, sometimes more.
Thanks in advance!