在Qt3D中使用SSBO

时间:2018-05-30 15:20:49

标签: qt3d

我无法使用Qt3D进行SSBO工作。我也无法找到一个显示应如何完成的示例。 以下是我的代码的主要部分:

缓冲区初始化:

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);
}

在我的所有尝试中,渲染后没有任何内容写入缓冲区。在init之后它们仍然是0。 有人知道我做错了什么吗?或者在某个地方,我可以找到一个有效的例子?

谢谢。

1 个答案:

答案 0 :(得分:0)

答案是我的FrameGraph中缺少BufferCapture组件。感谢HappyFeet在评论中给出的例子。