У меня есть вычислительный шейдер, работающий с моим буфером в моем приложении 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
Мой материал:
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
, функция добавлена в 5.9 (альфа-версия которого была выпущена только в этом месяце.)
Я еще не смог попробовать это решение, и я обновлю этот ответ, когда я это сделаю.
Есть пример этого в qt5/qt3d/tests/manual/buffercapture-qml
Источник информации: Список рассылки Qt Interest
Для решения до 5.9 я переписал все, чтобы быть похожим на пример Squircle SceneGraph, где я использую «сырье«OpenGL призывает рисовать то, что мне нужно. Одним из огромных преимуществ этого является то, что, поскольку я могу добавить к QOpenGLBuffer
Мне даже не нужно больше читать буфер.
Других решений пока нет …