Qt, openGL, виджеты и рендеринг вне экрана

Я занимаюсь разработкой для RedHat Linux, cat / etc / redhat-release:

    Red Hat Enterprise Linux Workstation release 7.2 (Maipo)

Я использую Qt Creator 4.3.1:

    Based on Qt 5.9.1 (GCC 5.3.1 20160406 (Red Hat 5.3.1-6), 64 bit)

Проект, который я разрабатываю, использует Qt 5.6.2 GCC 64bit, проект был разработан с использованием графических объектов, полученных из QWidget, включая прямой поток видео.

К сожалению, мы испытали разрыв в видео во время его воспроизведения, и это также очевидно в других виджетах, отображаемых вокруг видео, я считаю, что это потому, что видео не использует vsync.

Я верю, что использование openGL исправит эту ситуацию, цель состоит в том, чтобы переписать виджеты, включая воспроизведение видео, используя openGL. Я потратил несколько дней, пытаясь найти законченные и работающие решения, но до сих пор не смог найти полное и работающее решение.

Я смотрел на использование QOpenGLWidget, в виджете, который я использую для тестирования:

    class clsElevStrip : public QOpenGLWidget, protected QOpenGLFunctions {
Q_OBJECT

В конструкторе я установил формат для рендеринга вне экрана:

    //Create surface format for rendering offscreen
mobjFormat.setDepthBufferSize(24);
mobjFormat.setSamples(4);
mobjFormat.setVersion(3, 0);
mobjFormat.setSwapBehavior(QSurfaceFormat::DoubleBuffer);
setFormat(mobjFormat);

В методе paintGL:

    QOpenGLContext* pobjContext = context();
QSurface* pobjSurface = pobjContext->surface();
assert(pobjSurface != NULL);

int intSB1 = pobjSurface->format().swapBehavior();
qDebug() << (QString("paintGL:format: ")
+ QString::number(intSB1));
pobjContext->makeCurrent(pobjSurface);

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBegin(GL_TRIANGLES);
glColor3f(1.0, 0.0, 0.0);
glVertex3f(-0.5, -0.5, 0);
glColor3f(0.0, 1.0, 0.0);
glVertex3f( 0.5, -0.5, 0);
glColor3f(0.0, 0.0, 1.0);
glVertex3f( 0.0,  0.5, 0);
glEnd();

pobjContext->swapBuffers(pobjSurface);

На главном дисплее ничего не видно, оператор отладки показывает формат как 2 (DoubleBuffering).

Если я закомментирую строку в конструкторе:

    setFormat(mobjFormat);

Оператор отладки показывает формат как 0 (DefaultSwapBehavior). И графика видна, что я пропустил?

-1

Решение

Решение вашей проблемы простое:

Просто не все, что QOpenGLGLContext жонглирование. Весь смысл paintGL в том, что эта конкретная функция вызывается внутри обертки, которая уже выполняет всю эту жонглирование контекстом за вас. ** Нет необходимости звонить makeCurrent или же swapBuffers, Qt уже делает это для вас!

Из документации Qt

void QOpenGLWidget::paintGL()

Эта виртуальная функция вызывается всякий раз, когда виджет должен быть
окрашена. Переопределите это в подклассе.

Нет необходимости вызывать makeCurrent (), потому что это имеет
уже было сделано, когда эта функция вызывается.

Перед вызовом этой функции контекст и кадровый буфер
привязаны, и область просмотра устанавливается вызовом glViewport ().
Никакое другое состояние не установлено и не выполняется очистка или рисование
по рамкам.

Если у вас есть только это как ваш paintGL это покажет что-то, если у вас есть профиль совместимости > = Контекст OpenGL-3.x ИЛИ если вы используете <= Контекст OpenGL-2.x. Вы используете устаревший фиксированный конвейер функций, который будет не работать с контекстами профилей ядра OpenGL-3.x!

void glwidget::paintGL(){
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

glBegin(GL_TRIANGLES);
glColor3f(1.0, 0.0, 0.0);
glVertex3f(-0.5, -0.5, 0);
glColor3f(0.0, 1.0, 0.0);
glVertex3f( 0.5, -0.5, 0);
glColor3f(0.0, 0.0, 1.0);
glVertex3f( 0.0,  0.5, 0);
glEnd();
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]