2017-02-16 4 views
0

Ich habe einen Compute Shader auf meinem Puffer in meiner QML (5.8) -App, das Problem ist, dass ich nicht scheinen kann, diesen Puffer zu lesen, nur zu schreiben.QML: Lesen eines Puffers von einem Compute Shader

Mein Puffer ist ein Qt3DRender::QBuffer, habe ich seinen Inhalt mit

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

wo pc die Anzahl der Punkte ist.

es nutzen zu können, habe ich eine QGeometry erstellt, die bis QAttribute s setzt, und den Computer-Shader als Materialkomponente der Entity

Mein Material gelten:

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

In meinem Puffer Code aber Immer, wenn ich aus dem Puffer lese (Qt3DRender::buffer::data()), bekomme ich nur die Daten, die ich geschrieben habe, nicht das Ergebnis des Compute-Shaders.

Ich habe versucht, die usage auf verschiedene Dinge, aber keine Würfel.

In meinem OpenGL-Buch sehe ich, dass man glMapBuffer Lese-/Schreibzugriff haben kann, und es gibt sogar eine QOpenGLBuffer, die ein ENUM hat, um den Zugang in ähnlicher Weise zu setzen, aber ich kann nicht scheinen zu verwenden eins von denen; , d. H. Ich kann keinen Weg finden, um meinen Puffer zuzuordnen, und die QOpenGLBuffer scheint mit keinem der Renderer kompatibel zu sein.

+0

Obwohl ich nicht in der Lage war, diese Arbeit zu bekommen, erhielt ich eine [Antwort auf der Qt Interesse Mailingliste] (http://lists.qt-project.org/pipermail/interest/2017-March/026278.html), die in Qt 5.9 angeben, wird es eine 'BufferCapture'-Komponente geben, die in der Lage ist, einen OpenGL-Puffer einzulesen. Ich habe jedoch einen anderen Weg gefunden, um einen direkten Zugriff auf meinen OpenGL-Puffer zu bekommen (mit einem Szenen-Diagramm ähnlich dem Squickle-Beispiel) – Matt

Antwort

0

ich glaube, die Lösung BufferCapture zu bedienen ist, eine Funktion hinzugefügt, in 5,9 (wer alpha nur in diesem Monat veröffentlicht wurde.)

Ich habe nicht in der Lage gewesen, diese Lösung noch zu versuchen, und werde diese Antwort aktualisieren, wenn Ich mache.

Es ist ein Beispiel dafür in qt5/qt3d/tests/manual/buffercapture-qml

Info Source: Qt Interest Mailing List

Für eine Pre-5.9-Lösung, ich wieder schrieb alles auf den Squircle Scenegraph Beispiel ähnlich zu sein, wo ich „roh“ verwenden OpenGL-Aufrufe, um zu zeichnen, was ich brauche. Ein großer Vorteil davon ist, dass ich den Puffer nicht mehr lesen muss, da ich an eine QOpenGLBuffer anhängen kann.

Verwandte Themen