计算着色器不写入缓冲区
Compute Shader not writing to buffer
我正在寻求使用 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()
'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;
我是不是没有正确绑定缓冲区?或者是否有另一个 OpenGL 命令可以调用以实际分派计算?我尝试过不同的用法等
我已经发布了所有相关代码here。
看来问题出在错误的缓冲区绑定理解上。
pointOpenGLBuffer_.bind();
只将您的缓冲区绑定到您的 OGL 上下文,而不是您的着色器缓冲区,调用它两次不会成功。
第二次不只是绑定你需要调用
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, pointOpenGLBuffer_.bufferId());
其中 0 来自您的布局(std430,绑定 = 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()
'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;
我是不是没有正确绑定缓冲区?或者是否有另一个 OpenGL 命令可以调用以实际分派计算?我尝试过不同的用法等
我已经发布了所有相关代码here。
看来问题出在错误的缓冲区绑定理解上。
pointOpenGLBuffer_.bind();
只将您的缓冲区绑定到您的 OGL 上下文,而不是您的着色器缓冲区,调用它两次不会成功。
第二次不只是绑定你需要调用
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, pointOpenGLBuffer_.bufferId());
其中 0 来自您的布局(std430,绑定 = 0)