在不调用 PaintGL 的情况下渲染到 QOpenGLFramebufferObject

问题描述 投票:0回答:1

我想调用渲染例程

out
而不调用paintGL,原因是我正在尝试使用Qt OpenGL实现的现代例程渲染多通道效果,因此伪代码应该类似于:

for i=0 i<npasses i++
    glwidget->renderlayer i
glwidget->repaint //this calls paintGL

问题是,如果我从paintGL函数中调用

renderlayer
,一切都会变得疯狂,它会在我的整个应用程序上绘制,而不是在我的
glwidget
(继承自
QOpenGLWidget
)上。另一方面,
renderlayer
函数还可以,因为仅从paintGL内部调用,它的工作原理与预期一致。

这方面有什么建议吗?

qt opengl qtopengl
1个回答
1
投票

您可以像这样创建一个

QOffscreenSurface

QOpenGLWidget* widget = ...;
QOpenGLContext* ctx = widget->context();

QOffscreenSurface surface;
surface.setFormat(ctx->format());
surface.setScreen(ctx->screen());
surface.create();

然后将 GL 上下文重新定位到屏幕外表面,进行 FBO 渲染,最后将 GL 上下文重新定位回来。

ctx->makeCurrent(&surface);

// Bind FBO, do the rendering

widget->makeCurrent();
© www.soinside.com 2019 - 2024. All rights reserved.