【原创】qCustomPlot启用OpenGL

        网上有很多讲qCustomPlot启动OpenGL的文章,有些是很有用的,但也好像没有完全说清楚,现在把我觉得有用的收集起来,并加上一些自己的理解。

1. 下载qCustomPlot

     https://www.qcustomplot.com/

2. 下载freeglut库

     由于qCustomPlot需要调用glut库里的函数,但是glut库比较老旧,而且在实际测试中,也发现一旦new了多个图表控件,当鼠标在几个窗口之间点击的时候,会互相影响,错乱,甚至崩溃的现象。freeglut库是glut的最佳替代版本,更换之后,果然解决了这个问题。

    http://freeglut.sourceforge.net/index.php

 

3. 将"qcustomplot.h和qcustomplot.cpp"添加到自己的工程中,在qcustomplot.cpp最前面加一条头文件引用

#include "qcustomplot.h"

//<Added by jamie 2022.08.29
#include <GL/freeglut.h>
//>

4. 在qcustomplot.cpp文件中搜索 "QCPPaintBufferGlFbo::draw",在“drawImage”之前一行加入如下代码以修复上下文错误

/* inherits documentation from base class */
void QCPPaintBufferGlFbo::draw(QCPPainter *painter) const
{
  if (!painter || !painter->isActive())
  {
    qDebug() << Q_FUNC_INFO << "invalid or inactive painter passed";
    return;
  }
  if (!mGlFrameBuffer)
  {
    qDebug() << Q_FUNC_INFO << "OpenGL frame buffer object doesn't exist, reallocateBuffer was not called?";
    return;
  }

  //<Added by jamie 2022.08.29
  if (QOpenGLContext::currentContext() != mGlContext.data()) {
        mGlContext.data()->makeCurrent(mGlContext.data()->surface());
    }//>

  painter->drawImage(0, 0, mGlFrameBuffer->toImage());
}

5. 在工程.pro中添加以下内容:

        在工程右键"添加库",找到freeglut.lib库文件和头文件,把freeglut.dll文件拷贝到exe所在目录下,注意32位和64位库的目录有区别,由于项目中需要32位库,但该模块将来还想用于64位项目,所以我都给它加入进去,反正也不费电。

Qt +=opengl

DEFINES += QCUSTOMPLOT_USE_OPENGL

//不需要传说中的 Lib += -lopengl32

unix|win32: LIBS += -L$$PWD/../../../bin/Lib/freeglut-MSVC-3.0.0/freeglut/lib/ -lfreeglut
unix|win32: LIBS += -L$$PWD/../../../bin/Lib/freeglut-MSVC-3.0.0/freeglut/lib/x64/ -lfreeglut

INCLUDEPATH += $$PWD/../../../bin/Lib/freeglut-MSVC-3.0.0/freeglut/include
DEPENDPATH += $$PWD/../../../bin/Lib/freeglut-MSVC-3.0.0/freeglut/include

6. 在你代码中设置qCustomPlot开启OpenGl功能,在运行时,看到“应用程序输出”窗口有opengl = true字样,说明启动成功。

ui->customPlot->setOpenGl(true);
qDebug()<<"opengle="<<ui->customPlot->openGl();

 

QCustomPlot默认使用CPU来绘制图形,但是可以使用OpenGL和CUDA等技术来启用GPU绘图加速。具体实现如下: 1. 使用OpenGL加速绘图 QCustomPlot提供了一个OpenGL渲染器类QCPGLRenderer,它可以将QCustomPlot图形绘制到OpenGL窗口中。使用OpenGL加速绘图需要以下步骤: (1)创建OpenGL窗口并将其设置为QCustomPlot的绘图设备: ```c++ QOpenGLWidget *glWidget = new QOpenGLWidget(); ui->plot->setViewport(glWidget); ``` (2)创建QCPGLRenderer对象并将其设置为QCustomPlot的渲染器: ```c++ QCPGLRenderer *glRenderer = new QCPGLRenderer(ui->plot); ui->plot->setRenderer(glRenderer); ``` (3)启用OpenGL加速绘图: ```c++ glRenderer->setMode(QCPGLRenderer::pmOpenGL); ``` 2. 使用CUDA加速绘图 QCustomPlot还提供了一个CUDA加速绘图模块QCPGraphCUDAModule,它可以将图形数据传递给CUDA核心进行计算并将结果返回给QCustomPlot进行绘制。使用CUDA加速绘图需要以下步骤: (1)创建QCPGraphCUDAModule对象并将其设置为QCustomPlot的绘图模块: ```c++ QCPGraphCUDAModule *cudaModule = new QCPGraphCUDAModule(ui->plot); ui->plot->setPlottingHint(QCP::phFastPolylines, true); ui->plot->setPlottingHint(QCP::phForceRepaint, true); ui->plot->setPlottingHint(QCP::phCacheLabels, false); ui->plot->setPlottingHint(QCP::phCachePixmap, false); ui->plot->setPlottingHint(QCP::phMultiprocessorCount, 2); ui->plot->setPlottingHint(QCP::phMultiThreaded, true); ui->plot->setPlottingHint(QCP::phUseCUDA, true); ui->plot->setPlottingHint(QCP::phUseOpenGL, false); ui->plot->setPlottingHint(QCP::phUseOpenCL, false); ui->plot->addGraph(); ui->plot->graph(0)->setAdaptiveSampling(false); ui->plot->graph(0)->setLineStyle(QCPGraph::lsLine); ui->plot->graph(0)->setPen(QPen(Qt::red)); ``` (2)将数据传递给CUDA核心进行计算: ```c++ cudaModule->setData(data, size); ``` (3)启动绘图: ```c++ ui->plot->replot(); ``` 以上就是启用GPU绘图的具体实现方法。需要注意的是,使用GPU绘图可能会带来一些兼容性问题,需要根据实际情况进行选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jamie.T

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值