计算着色器不写入缓冲区

时间:2017-02-24 17:12:26

标签: c++ opengl compute-shader

我正在寻找帮助,使用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()来阅读我的缓冲区时,这些值永远不会改变,它们就是我最初插入的内容。

从计算着色器的角度来看,我接受了我的输入(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

1 个答案:

答案 0 :(得分:2)

似乎问题在于错误的缓冲区绑定理解。

pointOpenGLBuffer_.bind(); 

只将你的缓冲区绑定到你的OGL上下文,而不是绑定到着色器缓冲区,调用它两次就不会有效。

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

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

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