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