QML: чтение буфера, управляемого вычислительным шейдером

У меня есть вычислительный шейдер, работающий с моим буфером в моем приложении QML (5.8), проблема в том, что я не могу читать этот буфер, а только писать в него.

Мой буфер - это Qt3DRender::QBuffer, я устанавливаю его содержимое с помощью

Qt3DRender::QBuffer::setData(QByteArray::fromRawData(reinterpret_cast<const char*>(points_.linearize()), static_cast<int>(sizeof(PointType) * pc)));

где pc — количество баллов.

Чтобы использовать его, я создал QGeometry, который устанавливает QAttributes, и применил компьютерный шейдер в качестве материального компонента к 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 не совместим ни с одним из средств визуализации.


person Matt    schedule 16.02.2017    source источник
comment
Хотя мне не удалось заставить это работать, я получил ответ в списке рассылки Qt Interest, в котором говорится, что в Qt 5.9 будет компонент BufferCapture, способный читать буфер OpenGL. Однако я нашел другой способ (используя граф сцены, аналогичный примеру Squickle), чтобы получить прямой доступ к моему буферу OpenGL.   -  person Matt    schedule 17.03.2017


Ответы (1)


Я думаю, что решение состоит в том, чтобы использовать BufferCapture, функцию, добавленную в 5.9 (альфа-версия которой была выпущена только в этом месяце).

Я еще не смог попробовать это решение и обновлю этот ответ, когда сделаю это.

Пример этого есть в qt5/qt3d/tests/manual/buffercapture-qml

Источник информации: Список рассылки Qt Interest

Для решения до версии 5.9 я переписал все так, чтобы оно было похоже на пример Squircle SceneGraph, где я использую «необработанные» вызовы OpenGL для рисования того, что мне нужно. Одним огромным преимуществом этого является то, что, поскольку я могу добавить к QOpenGLBuffer, мне даже больше не нужно читать буфер.

person Matt    schedule 07.03.2017