glMapBuffer后的OpenGL计算着色器锁定

glMapBuffer后的OpenGL计算着色器锁定,opengl,opengl-3,Opengl,Opengl 3,我正在基于一些现有代码进行一个简单的布料模拟,并且正在使用OpenGL4.3配置文件。我面临的问题是,我正在尝试合并一个简单的计算着色器,它接受一个缓冲区,并为其添加一些值 一旦完成,我映射缓冲区,然后取消映射它。在前3帧之后,glDispatchCompute将锁定。然而,如果我注释掉地图并取消映射,它似乎运行良好。我尝试获取错误代码,但每帧返回0。对可能出现的问题有何看法 glUseProgram(computeShader); glBindBuffer(GL_SHADER_

我正在基于一些现有代码进行一个简单的布料模拟,并且正在使用OpenGL4.3配置文件。我面临的问题是,我正在尝试合并一个简单的计算着色器,它接受一个缓冲区,并为其添加一些值

一旦完成,我映射缓冲区,然后取消映射它。在前3帧之后,glDispatchCompute将锁定。然而,如果我注释掉地图并取消映射,它似乎运行良好。我尝试获取错误代码,但每帧返回0。对可能出现的问题有何看法

    glUseProgram(computeShader);
    glBindBuffer(GL_SHADER_STORAGE_BUFFER, cloth1.vertex_vbo_storage); // Buffer Binding 1
    glBufferData(GL_SHADER_STORAGE_BUFFER, cloth1.particles.size() * sizeof(Particle), &(cloth1.particles[0]), GL_DYNAMIC_COPY);
    glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, cloth1.vertex_vbo_storage);

    glDispatchCompute(6, 6, 1);
    glBindBuffer(GL_ARRAY_BUFFER, cloth1.vertex_vbo_storage);
    Particle * ptr = reinterpret_cast<Particle *>(glMapBufferRange(GL_ARRAY_BUFFER, 0, cloth1.particles.size() * sizeof(Particle), GL_MAP_READ_BIT));

    {
        GLenum err = glGetError();
        if (err > 0)
        {
            std::string name = std::string((char*)(glGetString(err)));
        }
    }

    //// memcpy(&cloth1.particles[0], ptr, cloth1.particles.size()*sizeof(Particle));
    glUnmapBuffer(GL_ARRAY_BUFFER);
    glBindBuffer(GL_ARRAY_BUFFER, 0);
glUseProgram(computeShader);
glBindBuffer(GL_着色器_存储_缓冲区,cloth1.vertex_vbo_存储);//缓冲区绑定1
glBufferData(GL_SHADER_STORAGE_BUFFER,cloth1.particles.size()*sizeof(Particle),&(cloth1.particles[0]),GL_DYNAMIC_COPY);
glBindBufferBase(GL_着色器_存储_缓冲区,0,cloth1.顶点_vbo_存储);
glDispatchCompute(6,6,1);
glBindBuffer(GL_数组_缓冲区,cloth1.vertex_vbo_存储);
Particle*ptr=reinterpret_cast(glMapBufferRange(GL_数组_缓冲区,0,cloth1.particles.size()*sizeof(Particle),GL_映射_读取位));
{
GLenum err=glGetError();
如果(错误>0)
{
std::string name=std::string((char*)(glGetString(err));
}
}
////memcpy(&cloth1.particles[0],ptr,cloth1.particles.size()*sizeof(Particle));
glUnmapBuffer(GL_数组_缓冲区);
glBindBuffer(GL_数组_BUFFER,0);

我想出来了。我在调度之间丢失了一个GL_着色器_存储_缓冲区的解除绑定

    glDispatchCompute(6, 6, 1);

    **glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, 0);**

    glBindBuffer(GL_ARRAY_BUFFER, cloth1.vertex_vbo_storage);