2017-02-16 5 views
0

내 QML (5.8) 응용 프로그램에서 내 버퍼에서 연산 쉐이더가 작동 중입니다. 문제는이 버퍼를 읽을 수없는 것입니다. 쓰기 만합니다.QML : 컴퓨팅 쉐이더에서 작동하는 버퍼 읽기

내 버퍼 나는

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

과 내용을 설정하는 Qt3DRender::QBuffer입니다.

Entity

내 물질 재료 구성 요소로 I가 QAttribute의를 설정하는 QGeometry를 생성, 사용, 컴퓨터 쉐이더를 적용하려면 : 내 버퍼 코드에서

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을 볼 수 있으며 유사한 방법으로 액세스를 설정하는 ENUM이있는 QOpenGLBuffer도 있지만 사용하지 못하는 것 같습니다. 이 중 하나; 내 버퍼를 매핑하는 방법을 찾을 수 없으며 QOpenGLBuffer은 렌더러와 호환되지 않는 것으로 보입니다.

+0

이 작업을 수행하지 못했지만 [Qt Interest 메일 링리스트에서 답변] (http://lists.qt-project.org/pipermail/interest/2017-March/026278.html)을 받았습니다. Qt 5.9에서는 OpenGL 버퍼에서 읽을 수있는'BufferCapture' 컴포넌트가있을 것입니다. 그러나 나는 (Squickle 예제와 비슷한 장면 그래프를 사용하여) 다른 방법으로 OpenGL 버퍼에 직접 액세스 할 수 있음을 발견했다. – Matt

답변

0

내가 솔루션 BufferCapture을 사용하는 것입니다 생각하는 기능은 아직이 솔루션을 시도 할 수 없었던 때, 그리고이 대답을 업데이트합니다

(의 알파는 이번 달에 출시되었습니다.) 5.9에 추가 나는한다. 사전 5.9 솔루션을

Info Source: Qt Interest Mailing List

qt5/qt3d/tests/manual/buffercapture-qml

이의 예입니다

, 나는 내가 "원시"사용 Squircle 장면 그래프의 예와 유사 할 모든 것을 썼다 재 OpenGL은 내가 필요한 것을 이끌어 내기 위해 호출합니다. 이것의 큰 이점 중 하나는 QOpenGLBuffer에 추가 할 수 있기 때문에 더 이상 버퍼를 읽을 필요조차 없다는 것입니다.