Dust3D项目实训十三 | 基于normalanddepthmapsgenerator 的法线和深度贴图生成分析

2021SC@SDUSC

目录

分析概括

模块功能

QThread类

关键代码分析

NormalAndDepthMapsGenerator.h分析

NormalAndDepthMapsGenerator.cpp分析


分析概括

模块功能

该模块主要进行法线和深度贴图的生成,通过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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值