Os desenvolvedores da biblioteca GTK anunciaram a prontidão de dois novos mecanismos de renderização — "ngl" e "vulkan", que utilizam as APIs gráficas OpenGL (GL 3.3+ e GLES 3.0+) e Vulkan. Os novos mecanismos estão incluídos na versão experimental do GTK 4.13.6. Na versão experimental do GTK, o mecanismo ngl agora é utilizado por padrão, mas caso sejam detectados problemas significativos, na próxima versão estável 4.14 o antigo mecanismo de renderização "gl" será reintroduzido.
Os novos mecanismos são posicionados como unificados e construídos a partir de uma única base de código. A essência da unificação é que a API Vulkan é utilizada como base, sobre a qual foi criado um nível de abstração separado para OpenGL, levando em consideração as diferenças entre OpenGL e Vulkan. Essa abordagem permitiu utilizar uma infraestrutura comum para ambos os mecanismos, para o processamento do gráfico de cenas (scene graph), transformações, cache de texturas e glifos. A unificação também simplificou significativamente a manutenção da base de código de ambos os mecanismos e a sua atualização e sincronização.
Ao contrário do antigo mecanismo "gl", que utilizava um shader simples separado para cada tipo de nó de renderização (rendernode) e realizava uma reordenação periódica dos dados durante a renderização fora da tela (offscreen), nos novos mecanismos aplica-se um shader complexo (ubershader), que interpreta os dados do buffer em vez da renderização fora da tela. Na sua forma atual, a nova implementação ainda está atrás da antiga em termos de níveis de otimização, uma vez que a atenção principal nesta fase é dada à correção do funcionamento e à simplicidade da manutenção.
Novas funcionalidades que estão ausentes no antigo mecanismo "gl":
- Antialiasing — permite preservar pequenas detalhes e alcançar contornos mais suaves.

- Formação de gradientes arbitrários, onde pode ser utilizado qualquer número de cores e suavização (no mecanismo "gl", apenas gradientes lineares, radiais e cônicos com 6 cores de parada eram suportados).

- Escalonamento fracionário (fractional scale), permitindo definir valores de escala não inteiros, por exemplo, ao usar uma escala de 125% para uma janela 1200×800, um buffer de 1500×1000 será alocado, e não 2400×1600 como no antigo mecanismo.
- Suporte à tecnologia DMA-BUF para uso de várias GPUs e desvio de operações específicas para outra GPU.
- Muitos nós de renderização que apresentavam problemas na implementação antiga agora são processados corretamente.
As limitações dos novos motores incluem a falta de suporte para posicionamento em valores não inteiros (posição fracionária) e nós glshader, que eram bastante dependentes das características do antigo motor, e dos quais a necessidade desapareceu após a adição de suporte a nós com máscaras (mask) e texturas com transparência. Também é mencionada a possibilidade de surgirem problemas com drivers gráficos, devido à mudança na forma de trabalhar com os drivers.
No futuro, a criação de motores de renderização baseados em uma nova modelo unificado que utilizem Metal no macOS e DirectX no Windows não está descartada, mas a criação desses motores é dificultada pelo uso de outras linguagens para shaders (nos motores "ngl" e "vulkan" é utilizado o shader GLSL, portanto, para Metal e Direct será necessário duplicar os shaders ou usar uma camada baseada na ferramenta SPIRV-Cross).
Nos planos futuros está a garantia de suporte a HDR e ferramentas para gerenciamento correto de cores, suporte à renderização de caminhos (Path rendering) no lado da GPU, possibilidade de renderização de glifos, renderização fora do fluxo principal e otimização de desempenho para dispositivos antigos e de baixo poder computacional. Atualmente, o desempenho do motor "vulkan" está próximo ao desempenho do antigo motor "gl". O motor "ngl" apresenta desempenho inferior ao do antigo motor "gl", mas os índices disponíveis são suficientes para renderização a 60 ou 144 FPS. Supõe-se que a situação mudará após a realização da otimização.
Fonte: opennet.ru

