Я ищу помощь в вызове вычислительного шейдера из Qt с помощью QOpenGLFunctions_4_3_Core
Функции OpenGL.
В частности, мой звонок 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 для вызова для фактической отправки вычислений? Я пробовал разные способы использования и т. Д.
Я разместил весь соответствующий код Вот.
Кажется, проблема в неправильном понимании привязки буфера.
pointOpenGLBuffer_.bind();
только привязывает ваш буфер к контексту OGL, а не к буферу шейдеров, его повторный вызов не поможет.
Во второй раз вместо того, чтобы просто связать вам нужно позвонить
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, pointOpenGLBuffer_.bufferId());
где 0 берется из вашего макета (std430, binding = 0)
Других решений пока нет …