Opengl 如何在不读取缓冲区数据的情况下处理粒子的生灭
我已经实现了一个简单的粒子系统,其中每个粒子的位置、速度、年龄和寿命存储在不同的SSBO中 大多数数据(包括所有位置、速度和年龄)都是通过计算着色器更新的。发射新粒子是由CPU处理的,因为这是一个串行过程。但是为了跟踪每个粒子是活的还是死的,我必须从SSBO(使用glGetBufferSubData())将所有寿命数据读回CPU,我担心这会使GPU暂停 所以我想知道是否有任何方法可以阻止从GPU读取数据。我发现AMD使用directX制作了一个演示粒子系统,它在计算着色器中使用了一个死列表和一个活列表。但我不知道如何用GLSL实现这一点。有什么想法吗 演示代码:Opengl 如何在不读取缓冲区数据的情况下处理粒子的生灭,opengl,glsl,Opengl,Glsl,我已经实现了一个简单的粒子系统,其中每个粒子的位置、速度、年龄和寿命存储在不同的SSBO中 大多数数据(包括所有位置、速度和年龄)都是通过计算着色器更新的。发射新粒子是由CPU处理的,因为这是一个串行过程。但是为了跟踪每个粒子是活的还是死的,我必须从SSBO(使用glGetBufferSubData())将所有寿命数据读回CPU,我担心这会使GPU暂停 所以我想知道是否有任何方法可以阻止从GPU读取数据。我发现AMD使用directX制作了一个演示粒子系统,它在计算着色器中使用了一个死列表和一个
...
// 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 );
}
...
。。。
//死区列表,因此在此帧中失效的任何粒子都可以添加到此列表中
AppendStructuredBuffer g_死区列表ToAddTo:寄存器(u2);
//使用此着色器生成的活动列表
RWStructuredBuffer g_IndexBuffer:寄存器(u3);
...
//死粒子被添加到死粒子列表中进行回收
如果(pb.m_年龄