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:点击跳转
觉得有帮助的话,打赏一下呗。。
需要商务合作(定制程序)的欢迎私信!!