ssbo в моей системе частиц не обновляется - PullRequest
0 голосов
/ 08 декабря 2018

Я работаю над системой частиц и хочу использовать SSBO для обновления скорости и положения моих частиц с помощью вычислительного шейдера.Но я вижу, что при каждом вызове обновления вычисления используют одинаковые значения позиций, но вычисляют позицию обновления, потому что в вызове отрисовки частицы перемещаются.

Загрузка частиц в SSBO

// Load Positions
glGenBuffers(1, &m_SSBOpos);

glBindBuffer(GL_SHADER_STORAGE_BUFFER, m_SSBOpos);


// Allocation de la mémoire vidéo

glBufferData(GL_SHADER_STORAGE_BUFFER, pb.size() * 4 * sizeof(float), NULL, GL_STATIC_DRAW);


GLint bufMask = GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT; // the invalidate makes a big difference when re-writing
float *points = (float *) glMapBufferRange(GL_SHADER_STORAGE_BUFFER, 0, pb.size() * 4 * sizeof(float), bufMask);
for (int i = 0; i < pb.size(); i++)
{
    points[i * 4] = pb.at(i).m_Position.x;
    points[i * 4 + 1] = pb.at(i).m_Position.y;
    points[i * 4 + 2] = pb.at(i).m_Position.z;
    points[i * 4 + 3] = 0;
}
glUnmapBuffer(GL_SHADER_STORAGE_BUFFER);

// Load vélocité

glGenBuffers(1, &m_SSBOvel);

glBindBuffer(GL_SHADER_STORAGE_BUFFER, m_SSBOvel);

// Allocation de la mémoire vidéo

glBufferData(GL_SHADER_STORAGE_BUFFER, pb.size() * 4 * sizeof(float), NULL, GL_STATIC_DRAW);

float *vels = (float *)glMapBufferRange(GL_SHADER_STORAGE_BUFFER, 0, pb.size() * 4 * sizeof(float), bufMask);
for (int i = 0; i < pb.size(); i++)
{
    vels[i * 4] = pb.at(i).m_Velocity.x;
    vels[i * 4 + 1] = pb.at(i).m_Velocity.y;
    vels[i * 4 + 2] = pb.at(i).m_Velocity.z;
    vels[i * 4 + 3] = 0;
}
glUnmapBuffer(GL_SHADER_STORAGE_BUFFER);

Обновление

glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 4, shaderUtil.getSSBOpos());
    glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 5, shaderUtil.getSSBOvel());

    // UPDATE DES PARTICULES
    shaderUtil.UseCompute();
    glUniform1i(shaderUtil.getDT(), fDeltaTime);
    glDispatchCompute(NUM_PARTICLES / WORK_GROUP_SIZE, 1, 1);
    glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT);
    shaderUtil.DeleteCompute();

Draw

shaderUtil.Use();

    glUniformMatrix4fv(glGetUniformLocation(shaderUtil.getProgramID(), "projection"), 1, GL_FALSE, glm::value_ptr(projection));
    glUniformMatrix4fv(glGetUniformLocation(shaderUtil.getProgramID(), "modelview"), 1, GL_FALSE, glm::value_ptr(View * Model));

    glPointSize(10);
    // Rendu
    glBindBuffer(GL_ARRAY_BUFFER, shaderUtil.getSSBOpos());
    glVertexPointer(4, GL_FLOAT, 0, (void *)0);
    glEnableClientState(GL_VERTEX_ARRAY);
    glDrawArrays(GL_POINTS, 0, NUM_PARTICLES);
    glDisableClientState(GL_VERTEX_ARRAY);
    glBindBuffer(GL_ARRAY_BUFFER, 0);
shaderUtil.Delete();

Компьютерный шейдер

#version 430 compatibility
#extension GL_ARB_compute_shader : enable
#extension GL_ARB_shader_storage_buffer_object : enable

layout(std140, binding = 4) buffer Pos
{
    vec4 Positions[]; // array of structures
};

layout(std140, binding = 5) buffer Vel
{
    vec4 Velocities[]; // array of structures
};

uniform float dt;

layout(local_size_x = 128, local_size_y = 1, local_size_z = 1) in;

void main()
{
    uint numParticule = gl_GlobalInvocationID.x;
    vec4 v = Velocities[numParticule];
    vec4 p = Positions[numParticule];

    vec4 tmp = vec4(0, -9.81, 0,0) + v * (0.001 / (7. / 1000.));

    v += tmp ;

    Velocities[numParticule] = v;

    p += v ;

    Positions[numParticule] = p;
}

Знаете ли вы, почему это произошло?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...