Compute Shader не пишет в буфер

Я ищу помощь в вызове вычислительного шейдера из 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 для вызова для фактической отправки вычислений? Я пробовал разные способы использования и т. Д.

Я разместил весь соответствующий код Вот.

0

Решение

Кажется, проблема в неправильном понимании привязки буфера.

pointOpenGLBuffer_.bind();

только привязывает ваш буфер к контексту OGL, а не к буферу шейдеров, его повторный вызов не поможет.

Во второй раз вместо того, чтобы просто связать вам нужно позвонить

glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, pointOpenGLBuffer_.bufferId());

где 0 берется из вашего макета (std430, binding = 0)

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector