2017-02-16 63 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是點的數量。雖然

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 
    } 
} 

在我的緩衝代碼,:

要使用它,我創建了一個QGeometry其中規定了QAttribute S,並應用計算機着色器作爲原料成分的Entity

我的材料每當我從緩衝區中讀取數據(Qt3DRender::buffer::data())時,我只能得到我寫入的數據,而不是計算着色器的結果。

我試過將usage設置爲各種東西,但沒有骰子。

在我的OpenGL書籍中,我看到有一個人可以glMapBuffer擁有讀/寫訪問權限,甚至有一個擁有ENUM設置訪問權限的QOpenGLBuffer,但似乎無法使用其中之一; 我無法找到映射我的緩衝區的方法,並且QOpenGLBuffer似乎與任何渲染器都不兼容。

+0

雖然我一直沒有能夠得到這個工作,我收到了[Qt興趣郵件列表上的答案](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解決方案的例子,我重新寫的一切是類似於方圓形場景圖例如,當我用「原料」 OpenGL調用來繪製我需要的東西。這樣做的一個巨大優勢是,因爲我可以附加到QOpenGLBuffer,所以我甚至不需要再讀取緩衝區。