Использование SSBO в Qt3D - PullRequest
0 голосов
/ 30 мая 2018

Я не могу заставить работать SSBO, используя Qt3D.Я также не могу найти ни одного примера, показывающего, как это должно быть сделано.Вот основные части моего кода:

Инициирование буфера:

QByteArray ssboData;
ssboData.resize(1000);
ssboData.fill(0);

mySSBOBuffer = new Qt3DRender::QBuffer(this);
mySSBOBuffer->setUsage(Qt3DRender::QBuffer::DynamicRead);
mySSBOBuffer->setAccessType(Qt3DRender::QBuffer::AccessType::ReadWrite);
mySSBOBuffer->setData(ssboData);

QByteArray atomicCounterData;
atomicCounterData.resize(4);
atomicCounterData.fill(0);

myAtomicCounterBuffer = new Qt3DRender::QBuffer(this);
myAtomicCounterBuffer->setUsage(Qt3DRender::QBuffer::DynamicRead);
myAtomicCounterBuffer->setAccessType(Qt3DRender::QBuffer::AccessType::ReadWrite);
myAtomicCounterBuffer->setData(atomicCounterData);

Передача буферов в виде QParameters на шейдер.

myMaterial->addParameter(new Qt3DRender::QParameter("acCountFrags", QVariant::fromValue(myAtomicCounterBuffer->id()), myMaterial));
myMaterial->addParameter(new Qt3DRender::QParameter("ssboBuffer", QVariant::fromValue(mySSBOBuffer->id()), myMaterial));

Я также пробовал

myMaterial->addParameter(new Qt3DRender::QParameter("acCountFrags", QVariant::fromValue(myAtomicCounterBuffer), myMaterial));
myMaterial->addParameter(new Qt3DRender::QParameter("ssboBuffer", QVariant::fromValue(mySSBOBuffer), myMaterial));

Фрагментный шейдер (цвет бесполезен, просто чтобы проверить, работает ли шейдер):

#version 430 core

layout(binding = 0, offset = 0) uniform atomic_uint acCountFrags;

layout (std430) buffer ssboBuffer
{
    uint fragIds[];
};

out vec4 color;

void main()
{
    uint index = atomicCounterIncrement(acCountFrags);
    fragIds[index] = 5;

    color = vec4(0.2, 0.2, 0.2, 1.0);
}

Во всех моих попытках ничего не записывается в буферы после рендеринга.Они все еще полны 0, как после init.Кто-нибудь знает, если я делаю что-то не так?Или где-нибудь я мог бы найти рабочий пример?

Спасибо.

1 Ответ

0 голосов
/ 31 мая 2018

Ответом был отсутствующий компонент BufferCapture в моем FrameGraph.Нашел это благодаря примеру, приведенному HappyFeet в комментариях.

...