OpenGL在Windows上慢速渲染50万个点

我怎样才能加快在Windows上的OpenGL绘图?

我有一个Qt 5.9.1应用程序,显示实时激光雷达数据,所以在一定的频率,我添加点到我的缓冲区(我已经超载作为一个循环缓冲区)。

在linux上,一切都很好,我所有的渲染器(我的激光雷达点,我的三维模型等)的渲染速度只有60帧/秒的一小部分。 然而,在Windows上,渲染激光雷达点几乎需要两个60 FPS帧的时间。 我测量了这个在glDrawArrays()调用之后插入glFlush()glFinish()

我的缓冲区大小约为1/2百万点。 我试图展示可能跨越几公里的点,但通常只限于1公里 – 我提到这一点,因为现在我没有做任何明确的截锥体挑选。

我的过程是:

  • 从一个向量加载新的点到我的重载循环OpenGL缓冲区。 每个点是20个字节(位置,强度,..)
  • 写所有我的统一variables(MVPmatrix等)
  • 调用glDrawArrays
  • 然后有一个顶点着色器只是传递数据
  • 实例化每个视口点的几何着色器(3)
  • 片段着色器,通过标高来着色点。

明确:

初始化

 auto LidarRenderer::initPointShaders() -> void { point_opengl_buffer_.setUsagePattern(QOpenGLBuffer::DynamicDraw); initializeOpenGLFunctions(); // Setup our vertex buffer object. point_opengl_buffer_.create(); render_program_ = make_unique<QOpenGLShaderProgram>(); // Vertex shader pretty much just passes points through render_program_->addShaderFromSourceFile(QOpenGLShader::Vertex, vertex_shader_); render_program_->addShaderFromSourceFile(QOpenGLShader::Geometry, geo_shader_); render_program_->addShaderFromSourceFile(QOpenGLShader::Fragment, fragment_shader_); render_program_->link(); render_program_->bind(); // Store the vertex attribute bindings for the program. { // Create our QOpenGLVertexArrayObject vao_.create(); QOpenGLVertexArrayObject::Binder vaoBinder(&vao_); // Bind out buffer point_opengl_buffer_.bind(); glEnableVertexAttribArray(0); // Vertex position data, send to location = 0, 3 floats per position, // not normalized, stride of 20 bytes, no offset glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 20, 0); glEnableVertexAttribArray(1); // Vertex intensity data, send to location = 1, 1 int, stride of 20 // bytes, 12 byte offset glVertexAttribIPointer(1, 1, GLint, 20, 12); // ... point_opengl_buffer_.release(); } render_program_->release(); } 

加载新点 (写入缓冲区):

 auto LidarRenderer::loadNewPoints() -> void { if (!point_opengl_buffer_.bind()) return; auto point_count = tmp_buffer_.size(); // Transform the points into the proper frame std::transform(tmp_buffer_.begin(), tmp_buffer_.end(), tmp_buffer_.begin(), [&my_nav_offset_vector_](const RegisterPoint& p) { return p - my_nav_offset_vector_; }); point_opengl_buffer_.write(&tmp_buffer_[0], static_cast<unsigned int>(point_count * sizeof(RegisterPoint))); point_opengl_buffer_.release(); // Clean our vector tmp_buffer_.clear(); } 

油漆

 auto LidarRenderer::paintGL() -> void { QOpenGLVertexArrayObject::Binder vaoBinder(&vao_); render_program_->bind(); // Draw all the ground points in the buffer glDrawArrays(GL_POINTS, 0, static_cast<GLsizei>(point_opengl_buffer_.CountVertices())); render_program_->release(); } 

该代码中的任何内容是否看起来不对 有没有办法来加速渲染? (我应该提到,我仍然是一个OpenGL初学者。)

Solutions Collecting From Web of "OpenGL在Windows上慢速渲染50万个点"