2017-02-16 29 views
0

У меня есть вычислительный шейдер, работающий на моем буфере в моем приложении 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 не совместим ни с одним из рендерингов.

+0

Хотя я не смог получить эту работу, я получил [ответ на список рассылки Qt Interest] (http://lists.qt-project.org/pipermail/interest/2017-March/026278.html), который указывается в Qt 5.9, будет существовать компонент «BufferCapture», который может читать в буфере OpenGL. Однако я нашел другой способ (используя граф сцены, подобный примеру Squickle), чтобы получить прямой доступ к моему буферу OpenGL – Matt

ответ

0

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

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

Существует пример этого в qt5/qt3d/tests/manual/buffercapture-qml

Info Source: Qt Interest Mailing List

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

 Смежные вопросы

  • Нет связанных вопросов^_^