OpenGL vs QOpenGL/QtOpenGL в Qt 5: различия и ограничения?

Поскольку существует два способа использования OpenGL с Qt 5 (QOpenGL/QtOpenGL и обычный OpenGL API), интересно, каковы ограничения каждого из них. Может ли кто-нибудь сказать, существуют ли ограничения с оберткой QOpenGL, о которой я должен знать?

Причина, по которой я спрашиваю об этом, заключается в том, что я не хочу начинать использовать оболочку QOpenGL и выяснять, что я не могу использовать полную возможность OpenGL API. Кто-нибудь имеет опыт работы с обоими и может дать некоторые подсказки с точки зрения возможностей, производительности и простоты использования?

Ответы

Ответ 1

Я не хочу начинать использовать оболочку QOpenGL и выяснять, что я не могу использовать полную возможность OpenGL API

Ну, Qt 5.0 Обертки OpenGL построены поверх спецификации OpenGL ES (Embedded Systems) 2.0, которая по сути представляет собой оштукатуренную версию спецификации OpenGL 3.0 на рабочем столе. Qt выбрала эту спецификацию, чтобы упростить переносимость, поскольку она широко поддерживается мобильными платформами, а также поддерживается практически на всех современных ПК. Если вы решите использовать обертки Qt, вам придется обойти недостатки спецификации OpenGL ES 2.0, которые по большей части относятся к следующим категориям:

  • Нет возможностей конвейера с фиксированной функцией. (без преобразования, glBegin, glEnd, glLightf и т.д.)
  • Нет поддержки расширенных возможностей OpenGL 3+ или поддержки только в расширениях. (объекты текстурного буфера, вычислительные шейдеры, атомные текстуры загрузки нагрузки, тесселяционные шейдеры, равномерные объекты буфера и т.д.).
  • Отсутствие определенных форматов текстур (целые текстуры, текстуры изображений и т.д.).
  • Небольшие различия в синтаксисе и семантике GLSL. (отсутствие квалификаторов макета, требования к точности данных через объявления highp, lowp и т.д.).
  • Отсутствие некоторых методов удобства. (glBlitFramebuffer, glMultiDrawArrays, glDrawRangeElements и т.д.)

Для полного описания спецификации OpenGL ES 2.0 смотрите здесь.

Однако это отсутствие функций не означает, что оболочки Qt не могут выполнить то, что вам нужно. Хотя OpenGL ES 2.0 не хватает много полезной функциональности, вы все равно можете выполнить 99% того, что позволит полная спецификация OpenGL на рабочем столе. Если вы решите использовать спецификацию OpenGL на рабочем столе с помощью пользовательских оболочек, Qt все равно сможет управлять созданием и отображением контекстов OpenGL на рабочем столе с использованием класса QGLFormat.

Имейте в виду, что если вы решили использовать настольные оболочки OpenGL и использовать их в приложении Qt, некоторые классы, предоставляемые Qt, могут помешать работе ваших пользовательских оболочек. Например, операции QPainter в QGLWidget могут использовать функциональность спецификации OpenGL ES и могут помешать работе ваших объектов-оберток.

Лично я предпочитаю использовать пользовательские оболочки OpenGL, так как я очень предпочитаю спецификации OpenGL на рабочем столе, поскольку набор функций лучше определен, и они предоставляют больше возможностей для решения проблемы. С другой стороны, Qt 5 предоставляет некоторые абсолютно фантастические архитектуры для быстрого и мощного динамического пользовательского интерфейса с использованием OpenGL ES. (Через QtQuick 2 и QML)

Какой API соответствует вашим потребностям, в основном, зависит от того, нацелены ли вы на встроенные или мобильные платформы (в этом случае вы вынуждены использовать OpenGL ES), и готовы ли вы жертвовать дополнительным временем разработки и поддерживать пользовательский OpenGL 3+ обертки.