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