我的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
似乎与任何渲染器兼容。
答案 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
,所以我甚至不需要再读取缓冲区。