У меня есть вычислительный шейдер, работающий с моим буфером в моем приложении 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
s, и применил компьютерный шейдер в качестве материального компонента к 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()
), я получаю только записанные в него данные, а не результат вычислительного шейдера.
Я пытался установить usage
на разные вещи, но не в кости.
В моей книге OpenGL я вижу, что можно glMapBuffer
иметь доступ для чтения/записи, и есть даже QOpenGLBuffer
, у которого есть ENUM для установки доступа аналогичным образом, но я не могу использовать ни один из них; т.е. я не могу найти способ сопоставить свой буфер, и QOpenGLBuffer
не совместим ни с одним из средств визуализации.
BufferCapture
, способный читать буфер OpenGL. Однако я нашел другой способ (используя граф сцены, аналогичный примеру Squickle), чтобы получить прямой доступ к моему буферу OpenGL. - person Matt   schedule 17.03.2017