Разработчиците на библиотеката 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

