当前位置: 首页 > news >正文

qt QOffscreenSurface详解

1、概述

QOffscreenSurface 是 Qt 中用于离屏渲染的一个类。它允许在不直接与屏幕交互的情况下进行 OpenGL 渲染操作,常用于生成纹理、预渲染场景等。通过 QOffscreenSurface,可以在后台创建一个渲染表面,进行绘制操作,并将结果捕获为 QImage 或其他格式。

2. 重要方法

  • 构造函数

    QOffscreenSurface::QOffscreenSurface(QScreen *targetScreen = nullptr);
    QOffscreenSurface::QOffscreenSurface(QScreen *targetScreen, QObject *parent);
    • 创建一个离屏表面对象,可指定目标屏幕和父对象。

  • 析构函数

    virtual QOffscreenSurface::~QOffscreenSurface();
    • 销毁离屏表面对象,释放相关资源。

  • 创建和销毁

    void QOffscreenSurface::create();
    void QOffscreenSurface::destroy();
    • create():创建离屏表面。

    • destroy():销毁离屏表面,释放相关资源。

  • 有效性检查

    bool QOffscreenSurface::isValid() const;
    • 检查离屏表面是否有效。

  • 原生句柄操作

    void *QOffscreenSurface::nativeHandle() const;
    void QOffscreenSurface::setNativeHandle(void *handle);
    • 获取和设置离屏表面的原生句柄。

  • 格式操作

    QSurfaceFormat QOffscreenSurface::requestedFormat() const;
    void QOffscreenSurface::setFormat(const QSurfaceFormat &format);
    virtual QSurfaceFormat QOffscreenSurface::format() const override;
    • 获取和设置离屏表面的请求格式。

    • format():获取当前表面的实际格式。

  • 屏幕操作

    QScreen *QOffscreenSurface::screen() const;
    void QOffscreenSurface::setScreen(QScreen *newScreen);
    • 获取和设置离屏表面的目标屏幕。

  • 尺寸获取

    virtual QSize QOffscreenSurface::size() const override;
    • 获取离屏表面的尺寸。

  • 表面类型获取

    virtual QSurface::SurfaceType QOffscreenSurface::surfaceType() const override;
    • 获取离屏表面的表面类型。

3. 信号

  • 屏幕更改信号

    void screenChanged(QScreen *screen);
    • 当离屏表面的目标屏幕发生变化时发出此信号,screen 参数表示新的目标屏幕。

4. 常用枚举

QOffscreenSurface 本身没有定义枚举,但它使用了 QSurfaceFormat 类中的枚举,例如:

  • QSurfaceFormat::FormatOptions

    • AlphaBuffer:启用 alpha 缓冲区。

    • DepthBuffer:启用深度缓冲区。

    • StencilBuffer:启用模板缓冲区。

    • Samples:多重采样抗锯齿的样本数。

#include "renderthread.h"

#include <QDebug>
#include <QOpenGLContext>
#include <memory>

RenderThread::RenderThread(QOpenGLContext *mainContext, QObject *parent)
    : QThread(parent)
    , m_mainContext(mainContext)
{
    m_surface = new QOffscreenSurface();
    m_surface->setFormat(mainContext->format());
    m_surface->create();

    m_renderContext = new QOpenGLContext;
    m_renderContext->setFormat(m_mainContext->format());
    m_renderContext->setShareContext(m_mainContext);
    m_renderContext->create();
    m_renderContext->moveToThread(this);
}

RenderThread::~RenderThread()
{
    wait();
}

void RenderThread::setNewSize(int width, int height)
{
    QMutexLocker lock(&m_mutex);
    m_width = width;
    m_height = height;
}

void RenderThread::runTask()
{
    //qDebug() << "run:" << QThread::currentThreadId();
    m_renderContext->makeCurrent(m_surface);

    if(renderer == nullptr)
    {
        renderer = new Renderer();
        renderer->moveToThread(this);
    }

    int width = 0;
    int height = 0;
    {
        QMutexLocker lock(&m_mutex);
        width = m_width;
        height = m_height;
    }
    renderer->render(width, height);

    FpsCounter::instance()->frame(FpsCounter::Render);

    m_renderContext->doneCurrent();
    emit imageReady(renderer->front_fbo.texture);
}

demo:点击跳转

觉得有帮助的话,打赏一下呗。。

           

需要商务合作(定制程序)的欢迎私信!! 

相关文章:

  • LORA学习笔记
  • 在 .NET 9 中使用 QUIC 实现高效通信:从基础到实战
  • 人工智能-群晖Docker部署DB-GPT
  • failed to load steamui.dll”错误:Steam用户的高频崩溃问题解析
  • 浅谈 Vue3 中的设计模式
  • Spring AI实战初体验——实现可切换模型AI聊天助手
  • 盛铂科技SPP5006/18/40G峰值脉冲功率计探头 国产功率计
  • 【开源宝藏】30天学会CSS - DAY9 第九课 牛顿摆动量守恒动画
  • 网站服务器常见的CC攻击防御秘籍!
  • C语言---函数指针 (指向函数的指针)
  • LeetCode 第29题、30题
  • c++手撕协程库,实现生成器与自定义可等待对象
  • MySQL作业二
  • 如何调整yarn.nodemanager.vmem-pmem-ratio参数?
  • Flutter深度解析:跨平台框架的架构设计与工程实践
  • 日语Learn,英语再认识(4)
  • 创维CW代工-通刷-晶晨S905L3/L3B-安卓9-线刷固件包及教程
  • 多模态大模型的基础模块
  • ROS2 架构梳理汇总整理
  • 如何让WordPress不同的页面、栏目显示不同的小工具侧边栏
  • 马鞍山做网站公司/最好的搜索引擎
  • 上饶时时彩网站建设/海南乐秀同城群软件下载
  • 政府门户网站建设的现状/爱站网关键词挖掘工具站长工具
  • 繁体商城网站模板/网络营销方案案例范文
  • 网站经常做封面的那些番号/网络推广整合平台
  • 重庆市建设和交通委员会网站/seo技术培训泰州