我想调用渲染例程
out
而不调用paintGL,原因是我正在尝试使用Qt OpenGL实现的现代例程渲染多通道效果,因此伪代码应该类似于:
for i=0 i<npasses i++
glwidget->renderlayer i
glwidget->repaint //this calls paintGL
问题是,如果我从paintGL函数中调用
renderlayer
,一切都会变得疯狂,它会在我的整个应用程序上绘制,而不是在我的glwidget
(继承自QOpenGLWidget
)上。另一方面,renderlayer
函数还可以,因为仅从paintGL内部调用,它的工作原理与预期一致。
这方面有什么建议吗?
您可以像这样创建一个
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();