Los desarrolladores de la biblioteca GTK han anunciado la disponibilidad de dos nuevos motores de renderizado: «ngl» y «vulkan», que utilizan las API gráficas OpenGL (GL 3.3+ y GLES 3.0+) y Vulkan. Los nuevos motores están incluidos en la versión experimental GTK 4.13.6. En la rama experimental de GTK, el motor ngl ahora se utiliza por defecto, pero, en caso de que se detecten problemas significativos en la próxima versión estable 4.14, se volverá al antiguo motor de renderizado «gl».
Los nuevos motores se posicionan como unificados y se construyen a partir de una base de código única. La esencia de la unificación es que se utiliza la API Vulkan como base, encima de la cual se ha creado un nivel de abstracción separado para OpenGL, que tiene en cuenta las diferencias entre OpenGL y Vulkan. Este enfoque ha permitido emplear en ambos motores una infraestructura común para el procesamiento del gráfico de escena, transformaciones, almacenamiento en caché de texturas y glifos. La unificación también ha simplificado notablemente el mantenimiento de la base de código de ambos motores y su actualización y sincronización.
A diferencia del antiguo motor «gl», en el que se utilizaba un sombreador simple separado para cada tipo de nodo de renderizado (rendernode) y se realizaba una reordenación periódica de los datos durante el renderizado fuera de pantalla (offscreen), en los nuevos motores se aplica un sombreador complejo (ubershader) que interpreta los datos del búfer. En su forma actual, la nueva implementación aún se queda atrás de la antigua en términos de niveles de optimización, ya que en esta etapa se está priorizando la corrección del funcionamiento y la simplicidad de mantenimiento.
Nuevas capacidades que faltan en el antiguo motor «gl»:
- Suavizado de contornos — permite mantener pequeños detalles y lograr contornos más suaves.

- Formación de gradientes arbitrarios, en los que se puede utilizar cualquier número de colores y suavizado (en el motor «gl» solo se soportaban gradientes lineales, radiales y cónicos con 6 colores de parada).

- Escalado fraccionario (fractional scale), que permite establecer valores de escala no enteros; por ejemplo, al usar un escalado del 125% para una ventana de 1200×800 se asignará un búfer de 1500×1000, y no de 2400×1600 como en el antiguo motor.
- Soporte para la tecnología DMA-BUF para utilizar múltiples GPU y trasladar operaciones individuales a otra GPU.
- Se manejan correctamente muchos nodos de renderizado que presentaban problemas en la antigua implementación.
Las limitaciones de los nuevos motores incluyen la falta de soporte para el posicionamiento en valores no enteros (posición fraccionaria) y nodos glshader, que estaban muy ligados a las características del antiguo motor, y que han quedado obsoletos tras la adición del soporte para nodos con máscaras (mask) y texturas con transparencia. También se menciona la probabilidad de que surjan problemas con controladores gráficos, debido al cambio en el método de trabajo con dichos controladores.
En el futuro, basado en el nuevo modelo unificado, no se descarta la creación de motores de renderizado que utilicen Metal en macOS y DirectX en Windows, aunque la creación de tales motores se complica por el uso de otros lenguajes para los sombreadores (en los motores 'ngl' y 'vulkan' se utiliza el lenguaje GLSL, por lo que para Metal y Direct será necesario duplicar los sombreadores o usar una capa basada en la herramienta SPIRV-Cross).
Entre los planes futuros se menciona proporcionar soporte para HDR y herramientas para la gestión correcta del color, soporte para el renderizado en ruta (Path rendering) desde la GPU, posibilidad de renderizado de glifos, renderizado fuera del hilo principal y optimización del rendimiento para dispositivos antiguos y de bajo consumo. En su estado actual, el rendimiento del motor 'vulkan' es comparable al del antiguo motor 'gl'. El motor 'ngl' tiene un rendimiento inferior al del antiguo motor 'gl', pero los índices disponibles son suficientes para renderizar a 60 o 144 FPS. Se espera que la situación cambie tras la optimización.
Fuente: opennet.ru

