Главная | IT | В GTK добавлены новые движки отрисовки для OpenGL и Vulkan

В GTK добавлены новые движки отрисовки для OpenGL и Vulkan

Разработчики библиотеки GTK объявили о готовности двух новых движков отрисовки – “ngl” и “vulkan”, использующих графические API OpenGL (GL 3.3+ и GLES 3.0+) и Vulkan. Новые движки включены в состав экспериментального выпуска GTK 4.13.6. В экспериментальной ветке GTK движок ngl включён по умолчанию, но в случае выявления значительных проблем в следующей стабильной ветке 4.14 может быть возвращён старый движок отрисовки “gl”.

Новые движки позиционируются как унифицированные и собираемые из единой кодовой базы. Суть унификации в том, что в качестве основы используется API Vulkan, поверх которого для OpenGL создан отдельный уровень абстракции, учитывающий отличия между OpenGL и Vulkan. Подобный подход позволил задействовать в обоих движках общую инфраструктуру для обработки графа сцены (scene graph), трансформаций, кэширования текстур и глифов. Унификация также заметно упростила сопровождение кодовой базы обоих движков и их поддержание в актуальном и синхронизированном состоянии.

В отличие от старого движка “gl”, в котором для каждого типа узлов рендеринга (rendernode) использовался отдельный простой шейдер и выполнялась периодическая пересортировка данных при закадровом рендеринге (offscreen), в новых движках вместо закадрового рендеринга применяется сложный шейдер (ubershader), интерпретирующий данные из буфера. В текущем виде новая реализация пока отстаёт от старой по уровню оптимизаций, так как основное внимание на текущей стадии удаляется корректности работы и простоте сопровождения.

Новые возможности, которые отсутствуют в старом движке “gl”:

  • Сглаживание контуров – позволяет сохранить мелкие детали и добиться отрисовки более ровных контуров.

  • Формирование произвольных градиентов, в которых может использоваться любое число цветов и сглаживание (в движке “gl” поддерживались только линейные, радиальные и конические градиенты c 6 цветами остановки).

  • Дробное масштабирование (fractional scale), позволяющее выставлять нецелые значения масштаба, например, при использовании масштаба 125% для окна 1200×800 будет выделен буфер 1500×1000, а не 2400×1600 как в старом движке.
  • Поддержка технологии DMA-BUF для использования нескольких GPU и выноса отдельных операций на другой GPU.
  • Корректно обрабатываются многие узлы рендеринга, с которыми были проблемы в старой реализации.

К ограничениям новых движков отнесено отсутствие поддержки позиционирования по нецелым значениям (fractional position) и узлов
glshader, которые были сильно завязаны на особенностях старого движка, и в которых пропала необходимость после добавления поддержка узлов с масками (mask) и текстур с прозрачностью. Также не исключается выявление непредвиденных проблем, связанных с графическими драйверами, так как в новом движке изменён метод взаимодействия с драйверами.

В будущем на базе новой унифицированной модели не исключается создание движков отрисовки, использующих Metal в macOS и DirectX в Windows, но создание подобных движков затруднено использованием иных языков для шейдеров (в движках “ngl” и “vulkan” задействован язык GLSL, поэтому для Metal и Direct придётся либо дублировать шейдеры, либо использовать прослойку на базе инструментария SPIRV-Cross).

Из планов на будущее упоминается обеспечение поддержки HDR и средств для корректного управления цветом, поддержка пути рендеринга (Path rendering) на стороне GPU, возможность рендеринга глифов, рендеринг вне основного потока и оптимизация производительности для старых и маломощных устройств. В текущем виде производительность движка “vulkan” близка к производительности старого движка “gl”. Движок “ngl” отстаёт по производительности от старого движка “gl”, но имеющихся показателей достаточно для отрисовки с частотой 60 или 144 FPS. Предполагается, что ситуация изменится после проведения оптимизации.

Источник