Important: Please read the Qt Code of Conduct -

Reading a buffer operated on by a compute shader

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

    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 to various things, but no dice.

    In my OpenGL book, I see that one can glMapBuffer 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 this on SO and Qt Center)

Log in to reply