Як багатьом відомо, QPainter має архітектуру з декількома бекендами і має дві основні реалізації малювання під капотом Qt 5: Це ростровий двигун малювання і двигун OpenGL2, який призначений для OpenGL ES 2.0.
GL Paint Engine
У той час як двигун растрового малювання є одним з дорогоцінного каміння Qt, давайте поговоримо про другу половину: двигун малювання GL, який використовується, коли відкривається QPainter на:
- QOpenGLWindow ,
- QOpenGLWidget ,
- або QOpenGLPaintDevice , який може переносити поточний контекст на ціль, що відмальовується, і в основному використовується при орієнтації FBOs .
Проблеми
А що щодо сучасної 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