除了要在使用变换反馈的粒子系统中/使用该粒子系统之外,没有太多要介绍的内容。我在渲染循环之间ping了两个vbo。这是初始缓冲区设置:
glGenBuffers(1, &p_vbo_r); glBindBuffer(GL_ARRAY_BUFFER, p_vbo_r);
glBufferData(GL_ARRAY_BUFFER, (MAX_PARTICLES*2) * sizeof(particle), &pp[0], GL_STREAM_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glGenBuffers(1, &p_vbo_w); glBindBuffer(GL_ARRAY_BUFFER, p_vbo_w);
glBufferData(GL_ARRAY_BUFFER, (MAX_PARTICLES*2) * sizeof(particle), &pp[0], GL_STREAM_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
MAX_PARTICLES
设置为262144。particle
是一个结构,包含2个glm::vec3
和2个GLfloat
,总计32个字节,因此我当前的设置创建的缓冲区略微超过16mb。 pp
是一个包含虚拟粒子数据的数组,因为使用gDebugger时,连续的0不会很明显。
glBindBuffer(GL_ARRAY_BUFFER, p_vbo_r);
glBufferSubData(GL_ARRAY_BUFFER, total_part*sizeof(particle), pp.size() * sizeof(particle), &pp[0]);
glBindBuffer(GL_ARRAY_BUFFER, p_vbo_w);
glBufferSubData(GL_ARRAY_BUFFER, total_part*sizeof(particle), pp.size() * sizeof(particle), &pp[0]);
p.buf_start = total_part;
total_part += pp.size();
每次将唯一的发射器添加到粒子系统时,都会发生这种情况。在完成任何渲染之前(当前),已添加给定场景中的所有可能的发射器,这实际上可以按预期工作!它存储完成后将发射器添加到p.buf_start中时使用的偏移量,并添加到运行偏移量中。
现在,奇怪的是,稍后在渲染/执行过程中使用相同的设置,导致glBufferSubData命令从0开始而不是从提供的偏移量开始,如下所示:
glBindBuffer(GL_ARRAY_BUFFER, p_vbo_r);
glBufferSubData(GL_ARRAY_BUFFER, p_sys[i].buf_start * sizeof(particle), pp.size() * sizeof(particle), &pp[0]);
glBindBuffer(GL_ARRAY_BUFFER, p_vbo_w);
glBufferSubData(GL_ARRAY_BUFFER, p_sys[i].buf_start * sizeof(particle), pp.size() * sizeof(particle), &pp[0]);
这是在循环中完成的,该循环检查缓冲区是否需要重置,并且需要重置。任何角色都可以在渲染之后的任何时间请求重置,并且缓冲区在帧结束后但下一帧开始渲染之前执行上述代码。列出的第一个发射器按预期工作,但是此后任何发射器总是从0而不是从给定偏移覆盖VBO。我无法覆盖转换反馈中涉及的ping响应缓冲区吗?试图弄清楚这一点有些棘手。谢谢!
编辑:我也尝试了GL_DYNAMIC_DRAW / GL_STATIC_DRAW对于初始缓冲区设置无济于事。