🧊La transparence et les Gaussian Splatting

Cette mission freelance Ă©tait l’occasion pour moi de me plonger dans les mĂ©andres de ce nouveau format de modĂšle 3D et des moteurs graphiques.

Le projet aframe-gaussian-splatting est un projet open source de composant pour le framework Aframe, permettant d’ajouter Ă  ce dernier le support pour les gaussian splatting.

Le problĂšme : pas le bon ordre

Dans l’image ci-dessous, deux statues de phoques sont affichĂ©es, la plus Ă©loignĂ©e apparait « devant » la plus proche.

Dans la capture ci-contre, on voit deux statues. Celle accompagnĂ©e de boules rouges est au premier plan, alors qu’elle est prĂ©sentĂ©e derriĂšre la statue au fond.

Qu’est-ce qui se passe ?
Dans notre contexte, on peut rĂ©sumer les Gaussian splatting Ă  des nuages de particules transparentes. Pour afficher correctement des objets transparents, il faut qu’ils soient triĂ©s du plus loin au plus proche de la camĂ©ra. Chaque modĂšle a son nuage et son propre shader pour faire le tri. Cependant, Aframe ne fait pas automatiquement le tri Ă  l’échelle d’une scĂšne entiĂšre. Ce qui fait qu’un des nuages est considĂ©rĂ© premier dans l’ordre de proximitĂ© sans cohĂ©rence rĂ©elle avec la situation actuelle.

Le phoque le plus loin est ici bien représenté en arriÚre plan, mais est masqué en partie par des artefacts autours du bord du premier phoque.

Le Depth Buffer Ă  la rescousse

Des objets opaques affichĂ©s les uns sur les autres ? Ce problĂšme n’est pas nouveau dans l’histoire de la 3D, c’est pour cela que les moteurs 3D et les shaders intĂšgrent maintenant un Depth Buffer.

C’est une image qui contient uniquement une information de profondeur afin que les shader sachent si le pixel qu’ils s’apprĂȘtent Ă  dessiner n’est pas masquĂ©.

Le hic de cette approche, c’est que le Depth Buffer est une propriĂ©tĂ© binaire (soit tu es dessinĂ©, soit tu ne l’es pas). Alors qu’un Gaussian Splatting n’est pas tout Ă  fait un objet Opaque. Sur la photo Ă  gauche, on peut bien voir que la bordure entre les objets n’a rien de net.
Certaines particules quasiment invisibles sortent du cadre du splatting, et empĂȘchent l’affichage d’objets lĂ©gitimes.

Cette fois, les deux phoques sont bien à leur place et leur modÚles ne sont pas masqués par des artefacts. Cependant leur qualité de rendu a été impacté.

Objets opaques mais transparents

La solution que nous avons choisie est d’agir sur le Fragment Shader, qui permet de dĂ©cider si un pixel est dessinĂ© ou non avec la commande discard.
Nous avons exposé dans le composant Aframe une propriété qui discard toutes les particules qui auraient une transparence inférieure à celle que le développeur choisi.

Ce n’est pas une solution parfaite, car cela dĂ©grade lĂ©gĂšrement le modĂšle 3D. Pour cela, cette fonctionnalitĂ© ne doit servir qu’en derniĂšre option.

Je recommande maintenant de traiter les Gaussian Splatting en amont en Ă©liminant les particules superflues directement dans un Ă©diteur de Gaussian Splatting.

TLDR

Individuellement, les Gaussian splatting proposent un rendu de captation unique par son rĂ©alisme. Mais dĂšs qu’ils sont mis dans le contexte d’une expĂ©rience 3D plus riche, la limite de l’usage de transparence Ă  l’excĂšs pour donner une impression d’opacitĂ© devient vite Ă©vidente.

L’approche choisie n’est pas parfaite, mais avec plus de temps, nous pourrions arriver Ă  un meilleur rĂ©sultat.