How to count dead particles in the compute shader?

Viewed 164

I am working on particle system. For calculation of each particle position, time alive and so on I use compute shader. I have problem to get count of dead particles back to the cpu, so I can set how many particles renderer should render. To store data of particles i use shader storage buffer. To render particles i use instancing. I tried to use atomic buffer counter, it works fine, but it is slow to copy data from buffer to the cpu. I wonder if there is some other option.

This is important part of compute shader

if (pData.timeAlive >= u_LifeTime)
    {
        pData.velocity = pData.defaultVelocity;
        pData.timeAlive = 0;
        pData.isAlive = u_Loop;
        atomicCounterIncrement(deadParticles)
        pVertex.position.x = pData.defaultPosition.x;
        pVertex.position.y = pData.defaultPosition.y;
    }

    InVertex[id] = pVertex;
    InData[id] = pData;

To copy data to the cpu i use following code

uint32_t* OpenGLAtomicCounter::GetCounters()
    {
        glBindBuffer(GL_ATOMIC_COUNTER_BUFFER, m_AC);
        glGetBufferSubData(GL_ATOMIC_COUNTER_BUFFER, 0, sizeof(uint32_t) * m_NumberOfCounters, m_Counters);     

        return m_Counters;
    }
0 Answers
Related