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

时间:2017-02-16 22:33:51

标签: c++ opengl qml glsl compute-shader

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

我的缓冲区是function custom_override_fields($fields) { if ( ! current_user_can( 'dealer_group' ) && isset( $fields['billing']['rep_name'] ) ) { unset( $fields['billing']['rep_name'] ); } if ( ! current_user_can( 'dealer_group' ) && isset( $fields['billing']['billing_company'] ) ) { unset( $fields['billing']['billing_company'] ); } return $fields; } ,我用

设置其内容
Qt3DRender::QBuffer

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

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

我的资料:

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()设置为各种内容,但没有骰子。

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

1 个答案:

答案 0 :(得分:0)

我认为解决方案是使用BufferCapture,这是5.9中添加的一项功能(本月只发布了alpha版本。)

我还没有尝试过这个解决方案,并会在我这样做时更新这个答案。

qt5/qt3d/tests/manual/buffercapture-qml

中有一个例子

Info Source: Qt Interest Mailing List

对于5.9之前的解决方案,我重新编写了与Squircle SceneGraph示例类似的所有内容,我使用&#34; raw &#34; OpenGL调用绘制我需要的东西。这样做的一个巨大优势是,因为我可以附加到QOpenGLBuffer,所以我甚至不需要再读取缓冲区。