Augmenter le nombre de lumières de Qt 3D par un graphe de shader
Une technique pour générer automatiquement les programmes nécessaires au rendu

Le , par dourouc05, Responsable Qt
Bien que Qt 3D gère sans problème des scènes avec un très grand nombre de sources lumineuses grâce à des techniques de rendu différé, les matériaux par défaut du module Qt 3D Extras sont, quant à eux, limités à seulement huit lumières : de fait, ils sont très liés à un mode de rendu direct. Quelques trucs et astuces permettent de définir plus de sources de lumière dans le code, mais le rendu, lui, n’en utilisera jamais plus de huit. Par exemple, dans cette vidéo, le code définit cent lumières, mais seulement huit parmi elles sont utilisées pour le rendu, les huit plus proches en fonction de l’état de la scène.


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.


Vous avez aimé cette actualité ? Alors partagez-la avec vos amis en cliquant sur les boutons ci-dessous :
Responsable bénévole de la rubrique Qt : Thibaut Cuvelier -