Los desarrolladores de la biblioteca GTK anunciaron 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 se incluyen en la versión experimental GTK 4.13.6. En la rama experimental de GTK, el motor de renderizado ngl se utiliza ahora por defecto, pero si se detectan problemas significativos, el antiguo motor de renderizado "gl" se revertirá a la próxima versión estable, la 4.14.
Los nuevos motores se posicionan como unificados y se construyen a partir de una única base de código. Esta unificación se basa en la API de Vulkan, sobre la cual se ha creado una capa de abstracción independiente para OpenGL, lo que compensa las diferencias entre OpenGL y Vulkan. Este enfoque permitió que ambos motores utilizaran una infraestructura común para el procesamiento de gráficos de escena, las transformaciones y el almacenamiento en caché de texturas y glifos. Esta unificación también simplificó significativamente el mantenimiento de las bases de código de ambos motores, manteniéndolas actualizadas y sincronizadas.
A diferencia del antiguo motor "gl", que utilizaba un sombreador simple independiente para cada tipo de nodo de renderizado y reordenaba periódicamente los datos durante el renderizado fuera de pantalla, los nuevos motores sustituyen el renderizado fuera de pantalla por un sombreador complejo (ubershader) que interpreta los datos de un búfer. En su forma actual, la nueva implementación aún presenta un retraso con respecto a la anterior en cuanto a optimizaciones, ya que el enfoque principal en esta etapa se centra en el correcto funcionamiento y la facilidad de mantenimiento.
Nuevas características que faltan en el antiguo motor "gl":
- Suavizar contornos le permite conservar detalles finos y lograr contornos más suaves.

- Genere degradados personalizados que puedan usar cualquier cantidad de colores y suavizado (en el motor gl, solo se admitían degradados lineales, radiales y cónicos con 6 paradas de color).

- Escala fraccionaria, que permite establecer valores de escala no enteros, por ejemplo, cuando se utiliza una escala del 125 % para una ventana de 1200 x 800, se asignará un búfer de 1500 x 1000, y no de 2400 x 1600 como en el motor anterior.
- Soporte para la tecnología DMA-BUF para utilizar múltiples GPU y descargar operaciones individuales a otra GPU.
- Muchos nodos de renderizado que eran problemáticos en la implementación anterior ahora se manejan correctamente.
Las limitaciones de los nuevos motores incluyen la falta de compatibilidad con posicionamiento fraccional y nodos glshader, que dependían en gran medida de las características del motor anterior y dejaron de ser necesarios tras la incorporación de la compatibilidad con nodos de máscara y texturas con transparencia. También se menciona la posibilidad de que surjan problemas con los controladores gráficos debido al cambio en su gestión.
En el futuro, no se descarta la creación de motores de renderizado que utilicen Metal en el nuevo modelo unificado. macOS y DirectX en Windows, pero la creación de dichos motores se complica por el uso de otros lenguajes para los sombreadores (los motores "ngl" y "vulkan" utilizan el lenguaje GLSL, por lo que para Metal y Direct tendrás que duplicar los sombreadores o usar una capa basada en el conjunto de herramientas SPIRV-Cross).
Los planes futuros incluyen compatibilidad con HDR y una gestión de color adecuada, renderizado de rutas basado en GPU, renderizado de glifos, renderizado fuera del subproceso principal y optimizaciones de rendimiento para dispositivos más antiguos y de menor potencia. Actualmente, el rendimiento del motor Vulkan es similar al del antiguo motor GL. El motor NGL presenta un rendimiento inferior al del antiguo motor GL, pero su rendimiento actual es suficiente para renderizar a 60 o 144 FPS. Se espera que esto mejore tras la optimización.
Fuente: opennet.ru

