[英]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
有一个示例
对于5.9之前的解决方案,我重新编写了所有内容,使其与Squircle SceneGraph示例相似,在该示例中,我使用“ raw ” OpenGL调用来绘制所需的图像。 这样做的一个巨大优点是,因为我可以追加到QOpenGLBuffer
,所以我不再需要读取缓冲区了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.