У меня есть вычислительный шейдер, работающий на моем буфере в моем приложении QML (5.8), проблема в том, что я не могу читать этот буфер, а писать его только.QML: Чтение буфера, на котором работает вычислительный шейдер
Мой буфер является 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 я вижу, что можно иметь доступ для чтения/записи, и есть даже QOpenGLBuffer
, у которого есть ENUM, чтобы установить доступ аналогичным образом, но я, похоже, не могу использовать любой из них; i.e. Я не могу найти способ сопоставить свой буфер, а QOpenGLBuffer
не совместим ни с одним из рендерингов.
Хотя я не смог получить эту работу, я получил [ответ на список рассылки Qt Interest] (http://lists.qt-project.org/pipermail/interest/2017-March/026278.html), который указывается в Qt 5.9, будет существовать компонент «BufferCapture», который может читать в буфере OpenGL. Однако я нашел другой способ (используя граф сцены, подобный примеру Squickle), чтобы получить прямой доступ к моему буферу OpenGL – Matt