Разработчиците на библиотеката 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' се поддържаха само линейни, радиални и конусни градиенти с 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. Предполага се, че ситуацията ще се промени след провеждане на оптимизация.
Източник: opennet.ru

