Рендеринг в QOpenGLFramebufferObject без вызова PaintGL

Я хочу вызвать процедуру рендеринга без вызова PaintGL, причина в том, что я пытаюсь визуализировать многопроходный эффект, используя современные процедуры реализации Qt OpenGL, поэтому псевдокод должен быть примерно таким:

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

Проблема в том, что если я вызываю renderlayer из функции PaintGL, все сходит с ума, и он рисуется по всему моему приложению, а не по моему glwidget (который наследуется от QOpenGLWidget), с другой стороны, функция renderlayer в порядке, поскольку вызывается только изнутри PaintGL. работает так, как ожидалось.

Любой совет по этому поводу?

заранее спасибо


person Frank Escobar    schedule 11.03.2017    source источник
comment
Перед вызовом renderlayer необходимо убедиться, что правильный контекст OpenGL активен/текущий и что ваш QOpenGLFramebufferObject привязан к этому контексту.   -  person G.M.    schedule 11.03.2017


Ответы (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();
person Joseph Artsimovich    schedule 11.03.2017