我实施了一个简单的粒子系统,其中每个粒子的位置,速度,年龄和寿命都存储在不同的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 );
}
...