我正在寻找帮助,使用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。
答案 0 :(得分:2)
似乎问题在于错误的缓冲区绑定理解。
pointOpenGLBuffer_.bind();
只将你的缓冲区绑定到你的OGL上下文,而不是绑定到着色器缓冲区,调用它两次就不会有效。
第二次而不是只是绑定你需要调用
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, pointOpenGLBuffer_.bufferId());
其中0来自您的布局(std430,binding = 0)