gpt4 book ai didi

c++ - Qt pointcloud 在 scene3d 中性能缓慢

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:38:02 27 4
gpt4 key购买 nike

我在为在 Scene3d 中显示点云而编写的 QML 应用程序中发现了主要性能问题。 1000 点/秒没问题,但在 10,000 点时它基本上只会让我的整个计算机停止运行。目标是达到数百万点(这是旧应用程序,Qt/VTK 混合物可以在减速之前完成。)

我担心我没有将处理卸载到另一个线程,或者没有正确渲染。 ...这是我的第一个 Qt 项目,对所有这一切都是陌生的。

基本上我构建了一个点的 circular_buffer(每个点是 32 字节),我将其复制到自定义 QGeometryEntity< 上的 QByteArray/。该实体具有运行顶点和片段着色器的 Material 。

我可以做些什么来提高性能吗?

Material :

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

最佳答案

找到问题了,我最初发布的信息中没有。

在实体中,我有 instanceCount: buffer.count,但在我的 Geometry 中,我一步写入了整个缓冲区。因此,我有效地平方了缓冲区的大小。

解决方案是设置instanceCount: 1

我之前对这一行感到困惑,甚至将其删除,但我怀疑它默认为该值。我不明白 QML 文档中关于这究竟会做什么的内容。

无论如何,它的真正用途是用于像 SphereGeometry 这样的几何体,它为每个点构建一个缓冲区。因此,给定一个点,它会构建顶点和索引以在该点周围渲染一个球体。 (我不确定他们为什么不在几何着色器中这样做。)

关于c++ - Qt pointcloud 在 scene3d 中性能缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41836095/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com