2017-01-24 8 views
4

Scene3dに点群を表示するために書いたQMLアプリケーションで、大きなパフォーマンスの問題が発生しています。 1000ポイント/秒であれば問題ありませんが、10,000であれば基本的にコンピュータ全体が停止します。目標は数百万点にまで上昇することです(これは古いアプリですが、Qt/VTK混合物が減速する前にできることです)。Qt pointcloudシーン3のパフォーマンスが遅い

私は別のスレッドに処理をオフロードしないことに心配しています。適切にレンダリングされません。 ...これは私の最初のQtプロジェクトであり、このすべてに新しいものです。

基本的に私は、EntityのカスタムQGeometryQByteArrayにコピーするポイント(各ポイントは32バイト)のcircular_bufferを構築します。このエンティティには、頂点シェーダとフラグメントシェーダを実行するマテリアルがあります。

パフォーマンスを向上させるためにできることはありますか?

材料

import Qt3D.Core 2.0 
import Qt3D.Render 2.0 

Material { 
    effect: Effect { 
     techniques: Technique { 
      renderPasses: RenderPass { 
       shaderProgram: ShaderProgram { 
        vertexShaderCode: loadSource("qrc:/shaders/pointcloud.vert") 
        fragmentShaderCode: loadSource("qrc:/shaders/pointcloud.frag") 
       } 
       renderStates: [ 
        PointSize { sizeMode: PointSize.Programmable } //supported since OpenGL 3.2 
       ] 
      } 
      graphicsApiFilter { 
       api: GraphicsApiFilter.OpenGL 
       profile: GraphicsApiFilter.CoreProfile 
       majorVersion: 4 
       minorVersion: 3 
      } 
     } 
    } 
     // some parameters... 
} 

私のシェーダは非常に単純です:

頂点

#version 430 

layout(location = 1) in vec3 vertexPosition; 

out VertexBlock 
{ 
    flat vec3 col; 
    vec3 pos; 
    vec3 normal; 
} v_out; 

uniform mat4 modelView; 
uniform mat3 modelViewNormal; 
uniform mat4 mvp; 
uniform mat4 projectionMatrix; 
uniform mat4 viewportMatrix; 

uniform float pointSize; 
uniform float maxDistance; 

void main() 
{ 
    vec3 vertexNormal = vec3(1.0, 1.0, 1.0); 
    v_out.normal = normalize(modelViewNormal * vertexNormal); 
    v_out.pos = vec3(modelView * vec4(vertexPosition, 1.0)); 

    float c  = (vertexPosition[0]*vertexPosition[0] + vertexPosition[1]*vertexPosition[1])*maxDistance; 
    v_out.col = vec3(c,c,0.5); 

    gl_Position = mvp * vec4(vertexPosition, 1.0); 
    gl_PointSize = viewportMatrix[1][1] * projectionMatrix[1][1] * pointSize/gl_Position.w; 
} 

がフラグメント

#version 430 

in VertexBlock 
{ 
    flat vec3 col; 
    vec3 pos; 
    vec3 normal; 
} frag_in; 

out vec4 colour; 

void main() 
{ 
    colour = vec4(frag_in.col, 1.0); 
} 

レンダラ

import Qt3D.Core 2.0 
import Qt3D.Render 2.0 

import "Cameras" 

RenderSettings { 
    id: root 

    property CameraSet cameraSet: CameraSet { 
     id: cameraSet 
    } 

    property real userViewWidth: 0.79 
    property real topOrthoViewHeight: 0.79 

    activeFrameGraph: Viewport { 
     id: viewport 
     normalizedRect: Qt.rect(0.0, 0.0, 1.0, 1.0) 

     RenderSurfaceSelector { 
      ClearBuffers { 
       buffers : ClearBuffers.ColorDepthBuffer 
       clearColor: theme.cSceneClear 

       NoDraw {} 
      } 

      Viewport { 
       id: userViewport 
       normalizedRect: Qt.rect(0, 0, userViewWidth, 1.0) 

       CameraSelector { 
        id: userCameraSelectorViewport 
        camera: cameraSet.user.camera 
       } 
      } 
      // Two other viewports... 
     } 
    } 
} 

エンティティ

Entity { 
    property PointBuffer buffer: PointBuffer { 
     id: pointBuffer 
    } 

    PointsMaterial { 
     id: pointsMaterial 
     dataBuffer: pointBuffer 
    } 

    Entity { 
     id: particleRenderEntity 
     property GeometryRenderer particlesRenderer: GeometryRenderer { 
      instanceCount: buffer.count 
      primitiveType: GeometryRenderer.Points 
      geometry: PointGeometry { buffer: pointBuffer } 
     } 

     components: [ 
      particlesRenderer 
      , pointsMaterial 
     ] 
    } 
} 

答えて

2

は、問題を発見し、それは私がもともと投稿情報ではありませんでした。

エンティティではinstanceCount: buffer.countでしたが、ジオメトリではバッファ全体を1ステップで書きます。したがって、私は効果的に私のバッファのサイズを二乗していました。

ソリューションは、私もそれを削除し、前のこのラインに困惑していたが、私はそれがその値にデフォルト設定を疑う...そして、まさにこのだろうに私はQMLのドキュメントを理解していなかったinstanceCount: 1

を設定することでした行う。

いずれの場合でも、実際の使用はSphereGeometryなどのジオメトリ用で、各ポイントのバッファを作成します。したがって、ある点が与えられると、その点の周りに球を描画するための頂点とインデックスが構築されます。 (なぜ彼らはジオメトリシェーダでこれをしないのか分かりません)

関連する問題