2021SC@SDUSC
分析概括
模块功能
该模块主要进行法线和深度贴图的生成,通过QThread管线进行多线程纹理生成,提高项目运行速度
QThread类
QThread类提供了一个与平台无关的管理线程的方法。一个QThread对象管理一个线程,在QThread类中,run()函数通过调用exec()函数来启动事件循环机制,并且在线程内部处理Qt的事件。其主要目的就是为了用线程来处理耗时的后台操作,从而让主界面能及时响应用户的请求操作。QThread的使用方法有两种:
1.QObject::moveToThread()
(1)在类中定义一个槽slot函数来定义线程需要做的工作
(2)在要使用线程的类中,新建一个QThread的对象和woker类对象,使用moveToThread()方法将worker对象的事件循环全部交由QThread对象处理
2.继承QThread类
(1)自定义一个继承QThread的类,重载类中的run()函数,在函数中写入需要执行的工作
(2)调用start()函数来启动线程。
关键代码分析
NormalAndDepthMapsGenerator.h分析
class NormalAndDepthMapsGenerator : public QObject
{
Q_OBJECT
public:
NormalAndDepthMapsGenerator(ModelWidget *modelWidget);
void updateMesh(Model *mesh);//更新网格
void setRenderThread(QThread *thread);//设置渲染管线
~NormalAndDepthMapsGenerator();
QImage *takeNormalMap();//设置法线图
QImage *takeDepthMap();//设置深度图
signals:
void finished();
public slots:
void process();//总应用过、流程
private:
ModelOffscreenRender *m_normalMapRender = nullptr;//法线渲染
ModelOffscreenRender *m_depthMapRender = nullptr;//深度渲染
QSize m_viewPortSize;//
QImage *m_normalMap = nullptr;//法线图
QImage *m_depthMap = nullptr;//深度图
ModelOffscreenRender *createOfflineRender(ModelWidget *modelWidget, int purpose);
void generate();
};
NormalAndDepthMapsGenerator.cpp分析
NormalAndDepthMapsGenerator中的updateMesh()函数用于网格的更新,当法线和深度渲染图更新时,其对应的网格也进行了相应的更新
void NormalAndDepthMapsGenerator::updateMesh(Model *mesh)
{
if (nullptr == mesh) {
//如果网格为空,将法线与深度图渲染设置为空并直接返回
m_normalMapRender->updateMesh(nullptr);
m_depthMapRender->updateMesh(nullptr);
return;
}
//将模型中的网格更新到法线与深度图渲染当中
m_normalMapRender->updateMesh(new Model(*mesh));
m_depthMapRender->updateMesh(mesh);
}
void NormalAndDepthMapsGenerator::setRenderThread(QThread *thread)
{//接收渲染管线并代入渲染管线
m_normalMapRender->setRenderThread(thread);
m_depthMapRender->setRenderThread(thread);
}
ModelOffscreenRender *NormalAndDepthMapsGenerator::createOfflineRender(ModelWidget *modelWidget, int purpose)
{//创建离线渲染
ModelOffscreenRender *offlineRender = new ModelOffscreenRender(modelWidget->format());
offlineRender->setXRotation(modelWidget->xRot());
offlineRender->setYRotation(modelWidget->yRot());
offlineRender->setZRotation(modelWidget->zRot());
offlineRender->setEyePosition(modelWidget->eyePosition());
offlineRender->setMoveToPosition(modelWidget->moveToPosition());
offlineRender->setRenderPurpose(purpose);
return offlineRender;
}
void NormalAndDepthMapsGenerator::generate()
{
m_normalMap = new QImage(m_normalMapRender->toImage(m_viewPortSize));
m_depthMap = new QImage(m_depthMapRender->toImage(m_viewPortSize));
}
void NormalAndDepthMapsGenerator::process()
{
generate();
emit finished();
}
QImage *NormalAndDepthMapsGenerator::takeNormalMap()
{//返回法线渲染图
QImage *normalMap = m_normalMap;
m_normalMap = nullptr;
return normalMap;
}
QImage *NormalAndDepthMapsGenerator::takeDepthMap()
{//返回深度渲染图
QImage *depthMap = m_depthMap;
m_depthMap = nullptr;
return depthMap;
}