Cette limitation est assez gênante pour Qt 3D, même s’il est possible d’utiliser d’autres techniques de rendu pour gérer plus de lumière (c’est notamment le cas du Qt 3D Studio Runtime). Elle est due à OpenGL ; plus précisément, au nombre d’implémentations d’OpenGL, sur du matériel extrêmement divers, des cartes graphiques modernes très haut de gamme à des puces bon marché utilisées dans certaines applications embarquées : parfois, les limitations en termes de quantité de données transférables sont énormes… et Qt 3D doit fonctionner raisonnablement bien sur tout ce matériel.
Les derniers développements à ce sujet utilisent le “graphe de shader“, apparu il y a peu dans Qt 3D. La technique implémentée est assez basique : sur des cartes qui en sont capables, toutes les lumières sont utilisées ; sur du matériel nettement moins puissant, le nombre d’instructions des shaders est fortement réduit (et le nombre de lumières gérées en même temps).
Ce graphe de shader est une véritable révolution pour Qt 3D. Il permet de générer des shaders à la volée, en utilisant une structure similaire au graphe des matériaux de la plupart des applications de modélisation 3D actuelles. Chaque nœud de ce graphe de shader correspond à une fonction : il s’agit d’un calcul à effectuer entre une série d’entrées et une série de sorties. Par exemple, le nœud d’une surface prend en entrée les angles d’incidence et de réflexion d’un rayon de lumière sur la surface, la couleur de ce rayon et de la surface, pour calculer la contribution à la luminosité. En connectant suffisamment de ces nœuds dans un graphe, on définit le flot de calculs effectués par un shader, que Qt 3D transforme alors dans un langage de programmation qui dépend du matériel et de l’API utilisés.
Pour le cas particulier des sources de lumière, il devient très facile de créer un nœud pour chaque source de la scène. Ensuite, le code généré peut être aussi efficace que possible pour gérer toutes ces lumières (avec un shader par source de lumière plutôt qu’un seul programme qui itère sur toutes les sources).
Source : Increasing the number of lights in Qt 3D.