繁体   English   中英

QML:读取由计算着色器操作的缓冲区

[英]QML: Reading a buffer operated on by a compute shader

我在QML(5.8)应用程序的缓冲区上运行了一个计算着色器,问题是我似乎无法读取此缓冲区,只能写入该缓冲区。

我的缓冲区是Qt3DRender::QBuffer ,我用

Qt3DRender::QBuffer::setData(QByteArray::fromRawData(reinterpret_cast<const char*>(points_.linearize()), static_cast<int>(sizeof(PointType) * pc)));

其中pc是点数。

要使用它,我创建了一个QGeometry来设置QAttribute ,并将计算机着色器作为Entity组件应用到Entity

我的资料:

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

但是,在我的缓冲区代码中,每当我从缓冲区( Qt3DRender::buffer::data() )读取Qt3DRender::buffer::data() ,我只会得到写入其中的数据,而不是计算着色器的结果。

我尝试将usage设置为各种事物,但没有骰子。

在我的OpenGL书中,我看到一个人可以对glMapBuffer进行读/写访问,甚至还有一个QOpenGLBuffer具有一个ENUM以类似的方式设置访问权限,但是我似乎无法利用其中任何一个。 我找不到映射缓冲区的方法,并且QOpenGLBuffer似乎与任何渲染器都不兼容。

我认为解决方案是使用BufferCapture ,这是5.9中添加的功能(此人的Alpha仅在本月发布)。

我还无法尝试该解决方案,当我这样做时会更新此答案。

qt5/qt3d/tests/manual/buffercapture-qml有一个示例

信息来源:Qt兴趣邮件列表

对于5.9之前的解决方案,我重新编写了所有内容,使其与Squircle SceneGraph示例相似,在该示例中,我使用“ raw ” OpenGL调用来绘制所需的图像。 这样做的一个巨大优点是,因为我可以追加到QOpenGLBuffer ,所以我不再需要读取缓冲区了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM