Я занимаюсь разработкой для 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). И графика видна, что я пропустил?
Решение вашей проблемы простое:
Просто не все, что 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();
}
Других решений пока нет …