2017-02-24 48 views
0

我正在寻找使用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

回答

2

看来这个问题是在错误的缓冲绑定理解。

pointOpenGLBuffer_.bind(); 

只有结合你的缓冲区,以您的OGL背景下,而不是你的着色器缓冲器,称这两次不会做的伎俩。

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

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

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

+0

它的工作!我昨天晚上也读过了这个功能,但由于某种原因没有尝试。我也认为我的注意力被我正在使用的'Format'所捕获(我指定'Core4.3',但当前缓冲区使用'Compatibility4.5')但是,谢谢!我自己辛苦工作的16个小时错过了这个解决方案。 :) – Matt

相关问题