Evgenii Legotckoi
Evgenii Legotckoi27 січня 2017 р. 07:53

Підтримка OpenGL Core Profile Context у QPainter

Як багатьом відомо, QPainter має архітектуру з декількома бекендами і має дві основні реалізації малювання під капотом Qt 5: Це ростровий двигун малювання і двигун OpenGL2, який призначений для OpenGL ES 2.0.

GL Paint Engine

У той час як двигун растрового малювання є одним з дорогоцінного каміння Qt, давайте поговоримо про другу половину: двигун малювання GL, який використовується, коли відкривається QPainter на:


Проблеми

А що щодо сучасної OpenGL?

Які проблеми почали виявлятися на початку: навколо Qt 5.0, для тих, хто потребував контексту основного профілю під час створення користувальницького OpenGL рендерингу, який в кінцевому рахунку спрацьовував досить часто. Такі компоненти як Qt Quick на початку не могли працювати з такими контекстами через необхідність покладатися на застарілу/віддалену функціональність (наприклад, покажчики на стороні клієнта), відсутній об'єкт масиву вершин, версія шейдерів GLSL, підтримка яких не є обов'язковою для таких контекстів.

У деяких випадках вибір профілю сумісності був життєздатним обхідним шляхом. Однак, Mac OS X / macOS як відомо, не вистачає підтримки для цього: є вибір між OpenGL 2.1 або контекстом основного профілю 3.2+. Спроби вирішити цю проблему, наприклад, рендеринг текстури в одному контексті, а потім використовувати текстуру в іншому контексті за допомогою спільного використання ресурсів часто марні, оскільки деякі платформи, як правило, відкидають спільне використання ресурсів між контекстами різних версій/профілю.

Прогрес

На щастя, під час життєвого циклу Qt 5 ці речі були покращені: По-перше Qt Quick, а потім інші, менш користувальницькі компоненти, засновані на GL, були виправлені, щоб функціонувати як з основними контекстами, так і з контекстами сумісності.

За станом на Qt 5.8 є один великий виняток: двигун малювання GL для QPainter.

Останній шматок, що бракує

Хорошою новиною є те, що це обмеження буде знято найближчим часом. Завдяки вкладу Krita , дивіться тут довідкову інформацію , QPainter тепер може функціонувати у профілі основних контекстів. Функціонально це не принесе будь-яких змін, рендеринг, як і раніше, відбувається з використанням тих же методів, як і раніше.

Крім виправлення оригінального патчу, також це було інтегровано з системою регресійного тестування, званої Lancelot. Це означає, що на додаток до растру (з різними форматами QImage) і OpenGL 2 також буде запускатися з контекстом основного профілю з цього моменту, щоб забезпечити вихід QPainter без регресії між випусками Qt.

Загалом це означає, що фрагмент коду наступного нижче функціонуватиме так, як і очікується.

class Window : public QOpenGLWindow {
  void initializeGL() override {
    QSurfaceFormat fmt;
    fmt.setVersion(4, 5); // or anything >= 3.2
    fmt.setProfile(QSurfaceFormat::CoreProfile);
    setFormat(fmt);
  }
  void paintGL() override {
    QPainter p(this);
    p.fillRect(10, 10, 50, 50, Qt::red);
    ...
  }
  ...
};

Коли?

Qt 5.9.

Патч тепер влити в qtbase у гілку "dev". Найближчим часом буде додано до Qt 5.9.

Источник Qt blog

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.

Вам це подобається? Поділіться в соціальних мережах!

Коментарі

Only authorized users can post comments.
Please, Log in or Sign up
г
  • ги
  • 23 квітня 2024 р. 15:51

C++ - Тест 005. Структуры и Классы

  • Результат:41бали,
  • Рейтинг балів-8
l
  • laei
  • 23 квітня 2024 р. 09:19

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:10бали,
  • Рейтинг балів-10
l
  • laei
  • 23 квітня 2024 р. 09:17

C++ - Тест 003. Условия и циклы

  • Результат:50бали,
  • Рейтинг балів-4
Останні коментарі
k
kmssr08 лютого 2024 р. 18:43
Qt Linux - Урок 001. Автозапуск програми Qt під Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
АК
Анатолий Кононенко05 лютого 2024 р. 01:50
Qt WinAPI - Урок 007. Робота з ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
EVA
EVA25 грудня 2023 р. 10:30
Boost - статичне зв&#39;язування в проекті CMake під Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
J
JonnyJo25 грудня 2023 р. 08:38
Boost - статичне зв&#39;язування в проекті CMake під Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
G
Gvozdik18 грудня 2023 р. 21:01
Qt/C++ - Урок 056. Підключення бібліотеки Boost в Qt для компіляторів MinGW і MSVC Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
Тепер обговоріть на форумі
G
Gar22 квітня 2024 р. 05:46
Clipboard Как скопировать окно целиком в clipb?
DA
Dr Gangil Academics20 квітня 2024 р. 07:45
Unlock Your Aesthetic Potential: Explore MSC in Facial Aesthetics and Cosmetology in India Embark on a transformative journey with an msc in facial aesthetics and cosmetology in india . Delve into the intricate world of beauty and rejuvenation, guided by expert faculty and …
a
a_vlasov14 квітня 2024 р. 06:41
Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Евгений, добрый день! Такой вопрос. Верно ли следующее утверждение: Любое Android-приложение, написанное на Java/Kotlin чисто теоретически (пусть и с большими трудностями) можно написать и на C+…
Павел Дорофеев
Павел Дорофеев14 квітня 2024 р. 02:35
QTableWidget с 2 заголовками Вот тут есть кастомный QTableView с многорядностью проект поддерживается, обращайтесь
f
fastrex04 квітня 2024 р. 04:47
Вернуть старое поведение QComboBox, не менять индекс при resetModel Добрый день! У нас много проектов в которых используется QComboBox, в версии 5.5.1, когда модель испускает сигнал resetModel, currentIndex не менялся. В версии 5.15 при resetModel происходит try…

Слідкуйте за нами в соціальних мережах