Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 如何在不读取缓冲区数据的情况下处理粒子的生灭_Opengl_Glsl - Fatal编程技术网

Opengl 如何在不读取缓冲区数据的情况下处理粒子的生灭

Opengl 如何在不读取缓冲区数据的情况下处理粒子的生灭,opengl,glsl,Opengl,Glsl,我已经实现了一个简单的粒子系统,其中每个粒子的位置、速度、年龄和寿命存储在不同的SSBO中 大多数数据(包括所有位置、速度和年龄)都是通过计算着色器更新的。发射新粒子是由CPU处理的,因为这是一个串行过程。但是为了跟踪每个粒子是活的还是死的,我必须从SSBO(使用glGetBufferSubData())将所有寿命数据读回CPU,我担心这会使GPU暂停 所以我想知道是否有任何方法可以阻止从GPU读取数据。我发现AMD使用directX制作了一个演示粒子系统,它在计算着色器中使用了一个死列表和一个

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

...
。。。
//死区列表,因此在此帧中失效的任何粒子都可以添加到此列表中
AppendStructuredBuffer g_死区列表ToAddTo:寄存器(u2);
//使用此着色器生成的活动列表
RWStructuredBuffer g_IndexBuffer:寄存器(u3);
...
//死粒子被添加到死粒子列表中进行回收
如果(pb.m_年龄