Evgenii Legotckoi
27 січня 2017 р. 18: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

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

Коментарі

Only authorized users can post comments.
Please, Log in or Sign up