我的QML(5.8)應用程序中的計算着色器在我的緩衝區上運行,問題是我似乎無法讀取此緩衝區,只能寫入它。QML:讀取由計算着色器操作的緩衝區
我的緩衝區是一個Qt3DRender::QBuffer
,我把它的內容與
Qt3DRender::QBuffer::setData(QByteArray::fromRawData(reinterpret_cast<const char*>(points_.linearize()), static_cast<int>(sizeof(PointType) * pc)));
其中pc
是點的數量。雖然
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
}
}
在我的緩衝代碼,:
要使用它,我創建了一個QGeometry
其中規定了QAttribute
S,並應用計算機着色器作爲原料成分的Entity
我的材料每當我從緩衝區中讀取數據(Qt3DRender::buffer::data()
)時,我只能得到我寫入的數據,而不是計算着色器的結果。
我試過將usage
設置爲各種東西,但沒有骰子。
在我的OpenGL書籍中,我看到有一個人可以glMapBuffer
擁有讀/寫訪問權限,甚至有一個擁有ENUM設置訪問權限的QOpenGLBuffer
,但似乎無法使用其中之一; 即我無法找到映射我的緩衝區的方法,並且QOpenGLBuffer
似乎與任何渲染器都不兼容。
雖然我一直沒有能夠得到這個工作,我收到了[Qt興趣郵件列表上的答案](http://lists.qt-project.org/pipermail/interest/2017-March/026278.html )在Qt 5.9中說明,將會有一個'BufferCapture'組件可以在OpenGL緩衝區中讀取。然而,我發現了一種不同的方式(使用類似於Squickle示例的場景圖)來直接訪問我的OpenGL緩衝區 – Matt