【问题标题】:OpenGL Compute shader lockup after glMapBufferglMapBuffer 之后的 OpenGL 计算着色器锁定
【发布时间】:2014-04-09 14:01:11
【问题描述】:

我正在基于一些现有代码进行简单的布料模拟,并且正在使用 OpenGL 4.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);

【问题讨论】:

    标签: opengl opengl-3


    【解决方案1】:

    我想通了。我错过了调度之间的 GL_SHADER_STORAGE_BUFFER 的解除绑定。

        glDispatchCompute(6, 6, 1);
    
        **glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, 0);**
    
        glBindBuffer(GL_ARRAY_BUFFER, cloth1.vertex_vbo_storage);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-23
      • 1970-01-01
      • 2021-10-31
      • 2020-11-22
      • 2017-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多