计算着色器不写入缓冲区

Compute Shader not writing to buffer

我正在寻求使用 QOpenGLFunctions_4_3_Core OpenGL 函数从 Qt 调用计算着色器的帮助。

具体来说,我对 glDispatchCompute(1024, 1, 1); 的调用似乎对绑定到它的缓冲区没有任何影响。 如何将缓冲区绑定到 QT 中的计算着色器,以便可以将着色器的结果读回 C++

我创建我的程序并将其绑定到 (Squircle.cpp):

    computeProgram_ = new QOpenGLShaderProgram();
    computeProgram_->addShaderFromSourceFile(QOpenGLShader::Compute, "../app/shaders/pointcloud.comp");
    computeProgram_->bindAttributeLocation("Particles", 0);
    m_ParticlesLoc = 0;

    computeProgram_->link();

然后将我的 QOpenGLBuffer 绑定到 (Squircle.cpp):

    // Setup our vertex buffer object.
    pointOpenGLBuffer_.create();
    pointOpenGLBuffer_.bind();
    pointOpenGLBuffer_.allocate(pointBuffer_.data(), pointBuffer_.vertexCount() * pointBuffer_.stride_);

然后我使用 (Squircle.cpp):

调用计算着色器
computeProgram_->bind();

// ... 

pointOpenGLBuffer_.bind();

glDispatchCompute(1024, 1, 1);

但是当我使用 read()map()'ing 读取我的缓冲区时,值永远不会改变,它们就是我最初插入的值。

从计算着色器的角度来看,我接受我的输入 (pointcloud.comp):

#version 430

layout(local_size_x = 1024) in;

struct ParticleData
{
    vec4 position;
};

// Particles from previous frame
layout (std430, binding = 0) coherent buffer Particles
{
    ParticleData particles[];
} data;

我是不是没有正确绑定缓冲区?或者是否有另一个 OpenGL 命令可以调用以实际分派计算?我尝试过不同的用法等

我已经发布了所有相关代码here

看来问题出在错误的缓冲区绑定理解上。

pointOpenGLBuffer_.bind(); 

只将您的缓冲区绑定到您的 OGL 上下文,而不是您的着色器缓冲区,调用它两次不会成功。

第二次不只是绑定你需要调用

glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, pointOpenGLBuffer_.bufferId());

其中 0 来自您的布局(std430,绑定 = 0)