I have a compute shader operating on my buffer in my QML (5.8) app, the problem is that I cannot seem to read this buffer, only write to it.
My buffer is a Qt3DRender::QBuffer, I set its contents with
Qt3DRender
::QBuffer::setData(QByteArray::fromRawData(reinterpret_cast<const
char*>
(points_.
linearize()), static_cast<int>
(sizeof(PointType
) * pc
)));
Qt3DRender::QBuffer::setData(QByteArray::fromRawData(reinterpret_cast<const char*>(points_.linearize()), static_cast<int>(sizeof(PointType) * pc)));
To copy to clipboard, switch view to plain text mode
where pc is the number of points.
To use it, I created a QGeometry which sets up QAttributes, and apply the computer shader as a material component to the Entity
My material:
Material {
property PointBuffer dataBuffer;
ShaderProgram {
id: computeShader
computeShaderCode: loadSource("qrc:/shaders/pointcloud.comp")
}
effect: Effect {
techniques: [
Technique {
renderPasses: [
RenderPass {
shaderProgram: computeShader
parameters: [
// Point buffer
Parameter { name: "Particles"; value: dataBuffer }
]
}
] // renderpasses
filterKeys: [
FilterKey { name: "type"; value: "compute" }
]
graphicsApiFilter {
api: GraphicsApiFilter.OpenGL
profile: GraphicsApiFilter.CoreProfile
majorVersion: 4
minorVersion: 3
}
} // technique
] // techniques
}
}
Material {
property PointBuffer dataBuffer;
ShaderProgram {
id: computeShader
computeShaderCode: loadSource("qrc:/shaders/pointcloud.comp")
}
effect: Effect {
techniques: [
Technique {
renderPasses: [
RenderPass {
shaderProgram: computeShader
parameters: [
// Point buffer
Parameter { name: "Particles"; value: dataBuffer }
]
}
] // renderpasses
filterKeys: [
FilterKey { name: "type"; value: "compute" }
]
graphicsApiFilter {
api: GraphicsApiFilter.OpenGL
profile: GraphicsApiFilter.CoreProfile
majorVersion: 4
minorVersion: 3
}
} // technique
] // techniques
}
}
To copy to clipboard, switch view to plain text mode
In my buffer code though, whenever I read from the buffer (Qt3DRender::buffer::data()), I only get the data I wrote to it, not the result of the compute shader.
I've tried setting the usage (http://doc.qt.io/qt-4.8/http://doc.qt.io/qt-5/qt3drender-qbuffer.html#UsageType-enum) to various things, but no dice.
In my OpenGL book, I see that one can [I]glMapBuffer[I] to have read/write access, and there's even a QOpenGLBuffer that has an ENUM to set the access in a similar way, but I can't seem to make use of either of these; i.e. I can't find a way to map my buffer, and the QOpenGLBuffer doesn't seem compatible with any of the renderers.
(Cross posted on forum.qt.io and SO)
Bookmarks