PDA

View Full Version : QML: Reading a buffer operated on by a compute shader



kheaactua
22nd February 2017, 16:02
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::fromRawDa ta(reinterpret_cast<const char*>(points_.linearize()), static_cast<int>(sizeof(PointType) * pc)));


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

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-5/qt3drender-qbuffer.html#UsageType-enum) to various things, but no dice.

In my OpenGL book, I see that one can 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]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 (https://forum.qt.io/topic/76502/qml-reading-a-buffer-operated-on-by-a-compute-shader) and SO (http://stackoverflow.com/questions/42285971/qml-reading-a-buffer-operated-on-by-a-compute-shader))