Mat*_*att 5 c++ performance qt glsl qml
我在编写的QML应用中看到了主要的性能问题,该应用是在Scene3d。以1000点/秒的速度可以,但是基本上以10,000点的速度就停止了我的整个计算机。目标是获得数百万个积分(这是旧的应用程序,在变慢之前,Qt / VTK混合可以完成)。
我担心我没有将处理任务转移到另一个线程中,或者渲染不正确。...这是我的第一个Qt项目,对所有这一切都是新的。
基本上,我建立了一个点的circle_buffer(每个点是32个字节),将其复制到QByteArray一个自定义的QGeometry上,一个上Entity。该实体具有运行顶点和片段着色器的材质。
我可以做些什么来提高性能吗?
材料:
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...
}
Run Code Online (Sandbox Code Playgroud)
我的着色器非常简单:
顶点:
#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;
}
Run Code Online (Sandbox Code Playgroud)
片段:
#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);
}
Run Code Online (Sandbox Code Playgroud)
渲染器:
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...
}
}
}
Run Code Online (Sandbox Code Playgroud)
实体
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
]
}
}
Run Code Online (Sandbox Code Playgroud)
发现问题了,而且它不在我最初发布的信息中。
在实体中,我有instanceCount: buffer.count,但在我的几何中,我一步写入了整个缓冲区。因此,我有效地平方了缓冲区的大小。
解决方案是设置instanceCount: 1
我之前对这一行感到困惑,甚至删除了它,但我怀疑它默认为该值。而且我不明白 QML 文档到底会做什么。
无论如何,它的真正用途是用于像 之类的几何图形SphereGeometry,它为每个点构建一个缓冲区。因此,给定一个点,它会构建顶点和索引来渲染该点周围的球体。(我不知道为什么他们不在几何着色器中这样做。)
| 归档时间: |
|
| 查看次数: |
433 次 |
| 最近记录: |