c++ - 计算着色器不写入缓冲区

标签 c++ opengl compute-shader

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

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

我创建我的程序并将其绑定(bind)到 ( 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 ) 绑定(bind):

    // 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;

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

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

最佳答案

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

pointOpenGLBuffer_.bind(); 

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

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

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

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

关于c++ - 计算着色器不写入缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42444493/

相关文章:

c++ - 如何在 Qt 项目 View 中为单个单元格设置委托(delegate)?

c# - GUI、跨平台、C# 和 OpenGL。是否可以?

opengl - 关于在 GLSL 中避免 IF

opengl - 在 OpenGL 中结合顶点数组和纹理

C++ 将管道读入字符串

c++ - srand(time(NULL)) : error C4430: missing type specifier - int assumed. 注意:C++不支持default-int

c++ - 在编译时初始化 double

gpgpu - DirectX 11 计算着色器设备同步?

c++ - 如何从 CPU 访问计算着色器的本地工作组的大小?

java - JOGL 中的 SSBO 遇到问题