Jump to content

  • Log In with Google      Sign In   
  • Create Account

Dynamic Injection of Particles Using the CS


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
No replies to this topic

#1 dr4cula   Members   -  Reputation: 275

Like
0Likes
Like

Posted 15 August 2014 - 04:58 AM

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!


Edited by dr4cula, 15 August 2014 - 04:59 AM.


Sponsor:



Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS