如何在不从缓冲区读取的情况下处理粒子的诞生和死亡

时间:2015-04-11 14:35:02

标签: opengl glsl

我实施了一个简单的粒子系统,其中每个粒子的位置,速度,年龄和寿命都存储在不同的SSBO中。

大多数数据,包括所有位置,速度和年龄,都通过计算着色器进行更新。并且发出新粒子由CPU处理,因为它是一个串行进程。但是为了跟踪每个粒子是活着还是死亡,我必须从SSBO(使用glGetBufferSubData())将所有生命周期数据读回CPU,这确实会使GPU停顿。

所以我想知道有没有办法阻止从GPU读取数据。我发现AMD使用directX制作了一个演示粒子系统,它在计算着色器中使用死列表和活动列表。但我不知道如何用GLSL实现这一目标。有什么想法吗?

演示代码:

...

// The dead list, so any particles that are retired this frame can be added to this list
AppendStructuredBuffer<uint>            g_DeadListToAddTo       : register( u2 );

// The alive list which gets built using this shader
RWStructuredBuffer<float2>              g_IndexBuffer           : register( u3 );

...

// Dead particles are added to the dead list for recycling
if ( pb.m_Age <= 0.0f || killParticle )
{
    pb.m_Age = -1;
    g_DeadListToAddTo.Append( id.x );
}

...

0 个答案:

没有答案