Les Voxels ont servi de système d'éclairage dans le monde Roblox au cours des quatre dernières années. Mais tôt ou tard, le temps du changement intervient dans tout. C'est pourquoi les développeurs se sont demandés quoi faire ensuite.
L'éclairage est délicat, il y a donc de nombreux facteurs à prendre en compte lors du choix de nouvelles technologies. Pour faciliter la prise de décision, Roblox a prototypé deux futurs systèmes: les voxels et les shadow maps. Afin de comprendre les limites des deux, il est d'abord important de comprendre comment ils fonctionnent.
Remarque: les captures d'écran de l'article sont disposées de manière à ce que les voxels soient toujours affichés à gauche et les shadow maps à droite.
Implémentation: voxels
Bien que ce système particulier fonctionne dans le jeu depuis longtemps, l'option envisagée ici a subi de nombreuses améliorations.
Les données du monde sont converties en un ensemble de grilles de voxels: chaque grille est centrée autour du personnage et peut être de taille de voxel de 1 à 16 (5 grilles au total). Chaque voxel contient des informations d'occupation allant de 0 à 100%. Les données d'éclairage sont ensuite calculées pour chaque voxel dans chaque maillage sur la base de ces informations de plénitude et de source / direction de lumière. Tout ce qui précède se produit sur le GPU car le processeur central n'est pas assez rapide pour mettre à jour autant de voxels avec une densité aussi élevée.
Le système stocke toutes les données dans des voxels, en particulier - pour chaque voxel disponible, il y a des données sur:
- Plénitude (plusieurs valeurs décrivant à quel point chaque voxel est plein);
- Puits de lumière (quelle partie du ciel est visible depuis le voxel);
- Ombre du soleil (combien de soleil est obscurci par le voxel);
- Couleurs de l'objet lumineux / du cône (approximation de la couleur / du cône de l'effet des sources lumineuses locales sur le voxel).
Ces informations sont ensuite utilisées pour calculer la couleur de chaque pixel à une résolution donnée. Les résolutions d'écran et de voxel peuvent être ajustées indépendamment l'une de l'autre. Certaines parties du maillage voxel peuvent être mises à jour image par image à mesure que les lumières / objets se déplacent.
Implémentation: shadow maps
Cette méthode utilise la pixellisation pour calculer la plupart des effets d'ombre. Elle est réalisée en trois étapes. Tout d'abord, pour chaque caste d'ombre, nous mettons à jour la carte des ombres, en lançant des castes de plusieurs rayons de la source lumineuse dans la scène et en nous rappelant les résultats de l'intersection. Nous construisons ensuite une structure d'accélération spatiale dans laquelle nous intégrons chaque objet de lumière visible, qui est essentiellement une grille de voxel en cône tronqué (également appelée grille de froxel).
La grille couvre toute la partie du monde du jeu vue par la caméra. Dans chaque froxel, nous écrivons une liste de tous les objets lumineux qui l'intersectent. Enfin, afin de calculer l'influence de toutes les sources de lumière, lors du rendu de la scène, pour chaque pixel, nous recherchons un froxel qui contient ce pixel, itérons sur toutes les sources de lumière, et pour chaque lumière, nous calculons son influence séparément à l'aide des cartes d'ombre construites dans la première étape.
Le système stocke les données dans deux structures:
- Atlas des ombres (toutes les cartes d'ombre de lumière visible regroupées dans une grande texture);
- Grille lumineuse (une grille froxel qui transforme efficacement un point de la caméra en une liste de lumières).
La couleur de chaque pixel est calculée dynamiquement et n'est pas stockée explicitement. Certaines parties de l'atlas des ombres peuvent être mises à jour image par image à mesure que les lumières / objets se déplacent.
Performance: voxels
La technique du voxel se prête mieux à la mise à l'échelle: pour dégrader la qualité de sortie, nous pouvons réduire le nombre de grilles de voxels ou mettre à jour moins de voxels par image (ce qui se traduit par un «délai de lumière» - une mise à jour plus lente de l'exposition à la lumière des objets par rapport à la mise à jour des objets eux-mêmes).
Les voxels ont trois caractéristiques de complexité: la complexité géométrique, la complexité de la lumière et le nombre de pixels. La complexité géométrique n'affecte que le coût de la voxélisation, donc l'ajout d'objets supplémentaires n'introduira pas de retards. La complexité de la lumière n'affecte que le coût de son calcul, qui ne dépend pas de la complexité géométrique ou du nombre de pixels. Enfin, la couleur finale du pixel est calculée à partir du nombre de voxels / lumières / objets, nous pouvons donc redimensionner la résolution sans affecter la qualité de l'éclairage.
Les performances de Voxel sont calculées comme O (G) + O (L) + O (P), où G est le nombre de triangles (complexité géométrique), L est le nombre de lumières, P est le nombre de pixels.
Malheureusement, les performances de pointe des voxels ne sont pas optimales car le nombre de voxels évolue à mesure que N3 et les GPU ne sont pas idéaux pour les méthodes de rafraîchissement requises et ne peuvent pas maintenir une bonne gestion des performances. Avec suffisamment de recherches sur le calcul GPU, la perte de performances peut être compensée, mais pour le moment, le coût de base peut rester assez élevé.
Performance: cartes fantômes
Les cartes Shadow sont plus conviviales pour le GPU car elles sont conçues sur la base de la rastérisation. Le coût de mise à jour de l'atlas des ombres peut être partiellement réduit en mettant en cache / retardant les mises à jour (ce qui conduit logiquement à une latence supplémentaire). L'optimisation de la représentation de la géométrie (y compris le niveau de détail du maillage) réduit également le coût de la méthode.
Cependant, la mise à jour des ombres dans des scènes complexes reste coûteuse, car le coût dépend à la fois de la quantité de détails géométriques et du nombre de lumières projetant des ombres. À l'intérieur d'un bâtiment, dans le cas d'une lumière en mouvement, l'ensemble du bâtiment doit être rendu à chaque image pour mettre à jour les informations d'ombre de cette lumière. Un grand nombre de projections de lumière en mouvement dans le bâtiment entraîne une diminution des performances: nous ne pouvons pas mettre à jour toutes les lumières du cadre en même temps, ce qui conduit à des artefacts visuels.
De plus, cette méthode ne permet pas de séparer le paramètre de résolution de la quantité de lumière: pour chaque pixel, il faut recalculer l'influence de toutes les sources lumineuses qui le recouvrent. Cette étape ne peut pas non plus être mise en cache, ce qui entraîne des problèmes de performances à haute résolution dans des scènes très éclairées: 20 lumières qui se chevauchent dans une pièce 4K peuvent nécessiter 160 millions d'estimations de lumière.
Les performances de Shadowmap sont calculées comme O (GL) + O (LP), où G est le nombre de triangles (complexité de la géométrie), L est le nombre de lumières, P est le nombre de pixels.
Évaluation des performances
Pour plus de clarté, les deux méthodes ont été utilisées pour des niveaux de jeu spécialement sélectionnés. Notez qu'il s'agit d' implémentations de niveau préexistantes et non spécifiquement conçues pour l'évaluation des performances.
Paris (ombres au soleil, très peu de sources lumineuses sans ombre)
- Voxels: mise à jour de l'ombre - 6 ms, rendu de la scène - 1,5 ms;
- Shadow maps: mise à jour des ombres - 1 ms, rendu de scène - 2,4 ms;
- Le coût de calcul de l'ombre de voxel de base est plus élevé car il est plus difficile à traiter pour le GPU.
Grottes (de nombreuses sources qui projettent des ombres)
- Voxels: mise à jour de l'ombre - 7 ms, rendu de la scène - 0,9 ms;
- Shadow maps: mise à jour des ombres - 10 ms, rendu de scène - 2,1 ms;
- En raison de la grande quantité de géométrie et de lumières mobiles, la mise à jour des cartes d'ombre est coûteuse.
Occidental (nombreuses sources d'ombre)
- Voxels: mise à jour de l'ombre - 8 ms, rendu de la scène - 1 ms;
- Shadow maps: mise à jour des ombres - 15 ms, rendu de scène - 2,5 ms;
- Avec des lumières en mouvement et de nombreux triangles, la mise à jour de la carte des ombres est coûteuse.
1000 sources lumineuses sans ombre
- Voxels: mise à jour légère - 20 ms, rendu de scène - 0,5 ms;
- Cartes d'ombre: mise à jour de la lumière - 0,5 ms, rendu de la scène - 5 ms;
- La quantité cumulative de chevauchement de lumière et de voxel dans ce cas ralentit la mise à jour du voxel. De plus, vous pouvez voir que dans l'étape proche, l'approximation pour «une lumière dans chaque voxel» n'est pas effectuée.
Performance: conclusion
Les shadow maps s'adaptent bien à la charge de travail, mais il y a deux choses à considérer:
- Le coût par pixel augmente à mesure que la résolution augmente, ce qui en fait une solution pratique uniquement à résolution moyenne (1080p); aller au-delà de 1080p nécessite un très bon GPU.
- Le coût du rendu des ombres augmente très rapidement dans le cas d'une géométrie complexe avec de nombreuses lumières dynamiques. Cela peut être compensé par un meilleur abattage, mais à ce stade, cela reste un problème fondamental.
Dans le même temps, en revanche, les performances du voxel dépendent beaucoup moins du contenu du niveau, mais ont un coût de base beaucoup plus élevé. Cela peut être compensé par des algorithmes GPU améliorés et des voxels réduits.
Mémoire requise
Les besoins en mémoire pour les shadow maps et les voxels dépendent de la qualité requise.
Dans le cas des voxels, plusieurs textures sont stockées en mémoire pour chaque étage, leur taille totale dépend donc du nombre d'étapes et de la taille de chacune d'elles. Actuellement, il y a 4 étapes (avec des tailles de voxel 1..8) de 128x64x128 voxels chacune, ce qui ajoute jusqu'à 128 Mo de VRAM utilisée. Il serait possible de créer 2 étapes supplémentaires (0,5 voxels et 16 voxels) ou de reconfigurer celles existantes, ce qui augmenterait cette valeur à 192 Mo. Inversement, vous pouvez réduire le nombre de cascades (en supprimant certaines cascades proches) dans les systèmes avec une mémoire limitée, puis l'impact minimum sur la mémoire peut être d'environ 64 Mo avec deux cascades (4..8) et d'environ 96 Mo avec trois (4 ..) seize).
Dans le cas des cartes d'ombre, un atlas de cartes d'ombre et une grille de froxel sont utilisés. Ce dernier dépend en partie de la résolution. La taille de l'atlas des ombres, à son tour, peut être réduite si la qualité des ombres doit être réduite pour améliorer les performances / la mémoire. Le système actuel utilise 73 Mo de mémoire vidéo, dont la plupart (64 Mo) sont occupés par l'atlas des ombres. Vous pouvez le réduire et ainsi limiter le nombre de lumières assombries ou la qualité des ombres. Vous pouvez également envisager certaines options pour les shadow maps qui nécessitent plus de mémoire pour prendre en charge la translucidité, ce qui signifie qu'elles prendront plus d'espace (jusqu'à 130 Mo ou plus). L'impact minimum sur la mémoire système est susceptible d'être atteint en réduisant la taille de l'atlas des ombres et en utilisant sa version plus simple, qui prendra environ 25 Mo.
Par comparaison, le système d'éclairage actuel a deux modes: haute (PC) et basse qualité (mobile). La version PC prend ~ 40 Mo (24 Mo de RAM, 16 Mo de VRAM); mobile - ~ 11 Mo (6 Mo de RAM, 5 Mo de VRAM).
En fait, les deux méthodes sont assez proches en termes d'impact sur la mémoire, mais les shadow maps sont un peu plus évolutives pour la même plage de lumière / ombre.
Compatibilité mobile
L'audience du jeu devient de plus en plus mobile, ce qui signifie que lors de la comparaison des implémentations sélectionnées, différents appareils de jeu doivent également être pris en compte. Sur les appareils haut de gamme, il devrait y avoir suffisamment de capacités API pour implémenter les deux méthodes, mais bien sûr, elles peuvent ne pas être aussi pratiques en termes de mémoire et de performances.
Le système d'éclairage voxel existant est idéal pour les appareils mobiles: il prend en charge de nombreuses fonctions d'éclairage complexes (ombres claires, lucarne, etc.) et effectue la plupart des calculs complexes sur le processeur, fournissant ainsi des exigences minimales pour les performances du GPU et l'ensemble des fonctionnalités ... Étant donné que ce système devra encore être pris en charge pour les appareils mobiles et les PC à bas prix dans un avenir prévisible, plusieurs options ont émergé pour prendre en charge un large éventail d'appareils:
- Gardez le système existant sous une forme mobile, le nouveau ne sera que PC / console. Cela signifie qu'une grande partie de la base d'utilisateurs n'aura pas accès au nouveau système.
- ( , ), /.
- low-end , , .
Dans tous ces cas, il est nécessaire de répondre à la question de la compatibilité des contenus, car l'une des principales promesses de la plateforme est de «télécharger un contenu une fois et de l'exécuter n'importe où». Nous devons encore y travailler. Au début, il semble que la nouvelle solution voxel soit meilleure en ce sens qu'elle offre une cohérence de qualité / comportement de l'ancien au nouveau système, tandis que les shadow maps représentent une transition plus abrupte vers une autre qualité, mais en même temps, ils sont plus susceptibles de s'entendre avec des capacités limitées sur les appareils mobiles.
Qualité: sources lumineuses
La solution shadow map fournit des informations fiables en termes de simulation des sources lumineuses: dans la capture d'écran ci-dessous avec 1000 lumières dans le cas des shadow maps, vous pouvez voir des reflets spéculaires parfaitement reproduits - modélisés avec BRDF, ce qui nous donne les réflexions lumineuses que nous voulons.
La solution de voxel est fondamentalement pire car elle se rapproche de l'effet de la lumière sur chaque voxel comme si elle provenait d'une seule source. À partir de cela, vous pouvez voir que la qualité de la réflexion spéculaire se détériore:
Ainsi, dans le cas des voxels dans la zone avec des reflets spéculaires, les couleurs fusionnent dans un rapport 1: 1, créant une lumière jaune au lieu de vert et rouge, même s'il n'y a pas de lumières jaunes dans la scène. En revanche, une solution de carte d'ombre simule avec précision la combinaison de couleurs.
Dans certains cas, nous obtenons des résultats très peu concluants, bien qu'ils puissent être améliorés à l'avenir:
dans l'exemple ci-dessus, vous pouvez voir des reflets de miroir incurvés, allongés et déformés, et dans quelques voxels sous l'un des objets, il n'y a aucune information lumineuse. La même capture d'écran pour les shadow maps donne un bien meilleur résultat.
Qualité: ombre
La qualité déterminante des shadow maps est la précision, tandis que les ombres voxel sont douces. Les cartes d'ombre fournissent des ombres assez nettes avec le moins de détails possible, mais suffisamment précises pour créer une ombre convaincante pour le personnage. D'autre part, l'algorithme voxel est très bon pour créer des ombres vraiment douces, mais les ombres provenant de petits détails ne sont pas enregistrées du tout ou ont une forme irrégulière.
Pour cette raison, une variante de la carte des ombres est actuellement utilisée pour rendre les ombres des personnages - cependant, il s'agit davantage d'une béquille, appliquée uniquement aux ombres des personnages projetées par le soleil. Les autres sources lumineuses ne sont pas prises en compte.
En outre, une technique clé pour accélérer les voxels consiste à utiliser des cascades. Cependant, cela signifie que les données de plénitude deviennent plus grossières à mesure que la distance du point de la scène nous intéresse. Dans ce cas, la qualité de l'ombre se détériore également à mesure que la distance entre la source et le récepteur de l'ombre augmente:
dans la capture d'écran ci-dessus, la taille du plus petit voxel serait suffisante pour rendre une ombre de haute qualité depuis le pont, mais le pont est trop éloigné de la surface de l'eau, donc ses voxels sont trop rugueux même lorsque à condition que les voxels près de la surface de l'eau soient assez bons.
Qualité: lucarne
Une fonction importante du pipeline voxel est le calcul du coefficient de la lucarne, qui détermine la partie du ciel visible à partir du voxel actuel. Il est utilisé pour mélanger l'éclairage intérieur et extérieur et est très efficace pour améliorer sa qualité. Dans la capture d'écran ci-dessous, l'extérieur de la maison doit être beaucoup plus lumineux que l'intérieur, même dans les zones ombragées. La solution voxel calcule et reproduit bien ce coefficient, mais dans le cas d'une shadow map, il est absent, il n'y a donc pas de possibilité de rendre les ombres sombres.
Qualité: précision géométrique
Il convient de noter les différences fondamentales de représentation géométrique entre les voxels et les shadow maps.
Les voxels supposent que tous les objets supportés par le moteur d'éclairage peuvent être «voxélisés» - c'est-à-dire que pour chaque voxel du monde du jeu, il existe un moyen rapide de calculer la quantité d'intersection entre l'objet et le voxel. Cela fonctionne bien pour les formes primitives, mais les objets complexes comme les CSG et MeshParts sont déjà un problème sérieux. Maintenant, une décomposition approximative et un ensemble d'autres hacks pour une voxélisation efficace aident en partie à cela, mais cela conduit souvent à des artefacts visibles. Dans le même temps, les shadow maps utilisent la même représentation polygonale que celle impliquée dans le rendu, afin de pouvoir parfaitement représenter les formes de tous les objets:
Qualité: fuites de lumière
Bien que la forme de l'ombre soit extrêmement importante, il est peut-être encore plus important que les pixels invisibles soient gérés correctement. Lorsque diverses approximations ne respectent pas cette règle, des fuites de lumière - des rayures visibles - se produisent, qui causent le plus de problèmes dans des environnements à contraste élevé - par exemple, à l'intérieur d'un bâtiment avec un soleil extérieur brillant. Voici un exemple de fuite de lumière:
il s'agit d'une fine section éclairée du sol juste contre le mur. Les shadow maps préservent bien mieux l'occlusion de la lumière et combattent ce problème.
Il existe plusieurs sources de fuites pour les voxels. Certains d'entre eux peuvent être atténués tout en conservant la plénitude anisotrope: par exemple, maintenant la mémoire stocke 3 valeurs par voxel, indiquant «combien de matière il y a dans la projection du voxel le long de l'axe» pour les trois axes. Malheureusement, bien que cela aide les détails subtils à projeter des ombres quelle que soit leur épaisseur, cela ne résoudra pas toutes les fuites. La seule façon de garantir un blocage complet de la lumière dans cet aspect est de rendre la pièce deux fois plus épaisse que le voxel. De plus, la fuite augmente avec la taille du voxel, ce qui signifie qu'elle devient plus perceptible à des niveaux de qualité inférieurs et / ou plus loin.
Les shadow maps ne sont pas complètement scellées, mais les fuites y sont beaucoup moins problématiques - par exemple, dans cette implémentation, un objet d'une épaisseur de 0,4 voxels ne transmettra pas la lumière visible (avec une épaisseur de 0,2 voxels, il peut transmettre une partie de la lumière, mais aussi à partir de cela vous pouvez vous en débarrasser à l'avenir).
Qualité: conclusion
Les cartes d'ombre sont excellentes dans la plupart des aspects de la qualité. La seule zone qui s'affaisse de manière significative est le calcul du rapport de la lucarne. Cela peut nécessiter une méthode hybride qui utilise la voxélisation pour la lucarne, ce qui introduit un certain accroc au pipeline voxel - ou peut-être existe-t-il des solutions alternatives à ce problème. Ce serait également bien de pouvoir prendre en charge les ombres douces, ce qui peut être fait avec certaines extensions de l'algorithme de shadow map.
Les voxels offrent une qualité acceptable, mais par rapport aux shadow maps, ils perdent beaucoup, en particulier dans la fidélité des ombres et des reflets spéculaires. Nous devrons en quelque sorte résoudre ces problèmes afin de pouvoir mettre en œuvre un éclairage voxel qui peut fournir de belles ombres au joueur, car l'utilisation de la solution actuelle ne donne que celles du soleil, ce qui semble incompatible avec la vision future du monde dans le jeu.
Visibilité: translucidité
Le rendu des ombres est un problème assez bien étudié pour les objets opaques, mais la translucidité est une tout autre question. Étant donné que dans le cas d'un système voxel, la lumière se déplace à travers les cellules voxel en fonction de la valeur de la plénitude, il n'est pas trop difficile de maintenir des ombres semi-transparentes que les ombres à basse fréquence (douces) des effets de particules et d'autres objets semi-transparents de la scène peuvent donner, y compris l'auto-ombres pour Les effets de particules eux-mêmes:
Voici une vidéo de cet effet en mouvement:
Il n'y a actuellement aucune prise en charge de la translucidité pour les shadow maps. Cela signifie que si nous voulons supporter des particules ou d'autres objets transparents projetant des ombres, une autre solution doit être trouvée. Il existe des recherches pour des représentations alternatives de carte d'ombre qui pourraient servir ce cas d'utilisation, mais il reste à voir dans quelle mesure cela est efficace.
Visibilité: végétation
Bien que les cartes d'ombre ne soient pas particulièrement efficaces avec la translucidité, elles peuvent montrer des détails fins sur des objets (tels que la végétation), qu'ils soient modélisés avec de la géométrie ou des textures. Les voxels ne sont pas assez petits pour servir ce cas d'utilisation. De plus, dans ce cas, il n'est pas facile d'accéder aux informations sur la texture, car cela nécessite une modélisation précise de la surface du maillage, pas du volume. Il est peu probable qu'il soit jamais possible d'obtenir de belles ombres de la végétation à l'aide de voxels, alors que les shadow maps peuvent le fournir même avec du contenu existant, comme le montre cette capture d'écran:
Visibilité: auto-illumination
En raison de la façon dont les voxels sont mis en œuvre, il est relativement facile d'injecter des lumières de forme et de quantité arbitraires dans le maillage sans affecter les performances des autres parties du pipeline. Cependant, même si vous ajoutez de nombreuses lumières aux cartes d'ombre, la création de lumières aux formes irrégulières pose certains problèmes d'architecture et de performances. En particulier, il est beaucoup plus facile de réaliser une véritable auto-luminosité avec des voxels: le matériau néon est actuellement utilisé pour "émettre de la lumière", mais il n'émet pas réellement de lumière vers d'autres objets à proximité.
Oui, vous pouvez ajouter des lumières supplémentaires, mais ce serait bien de tout faire automatiquement. Les shadow maps ne sont pas très utiles pour cela, mais les voxels supportent la voxélisation de n'importe quelle forme par nécessité, et il est donc assez facile de supporter l'émission de lumière à partir d'objets auto-lumineux avec eux.
Visibilité: illumination globale
L'illumination globale (GI) fait référence au calcul des effets d'éclairage secondaires, tels que la lumière d'une lampe rebondissant deux fois sur les murs pour fournir un éclairage supplémentaire dans les zones où les faisceaux lumineux directs ne peuvent pas atteindre.
GI dans Roblox est extrêmement complexe, et la plupart des décisions à ce sujet doivent sacrifier quelque chose de l'éclairage dynamique, de la géométrie dynamique, des performances, des scènes à grande échelle. N'importe lequel de ces sacrifices est interdit.
On ne sait pas quelles solutions IG seraient pratiques compte tenu des contraintes de contenu strictes. Jusqu'à présent, l'IG basée sur le voxel semble être plus prometteuse que les autres approches.
Bien sûr, avoir une IG à base de voxel ne signifie pas que l'éclairage direct est calculé à l'aide de ces derniers: la plupart des recherches sur l'IG à base de voxel consistent aujourd'hui à utiliser des cartes d'ombre pour calculer la lumière directe et améliorer les résultats avec les voxels.
Sommaire
Sur la base de l'analyse ci-dessus, nous compilerons un tableau récapitulatif sur l'efficacité des deux solutions. Les cellules en italique suggèrent que de nouvelles recherches peuvent améliorer ce domaine. La notation dans le tableau est la suivante: Terrible <Faible <Normal <Bon <Excellent.
Les voxels sont donc parfaits pour modéliser l'éclairage indirect, mais pas si bons en matière d'éclairage direct. Dans le même temps, ils sont assez gourmands en ressources, ce qui est mal corrélé à la tâche de maintenance d'un large pool d'appareils.
Cela a conduit à la décision de créer un système de carte d'ombre pour l'éclairage direct. La solution au problème de la lucarne et de l'éclairage global n'a pas encore été trouvée sans équivoque, mais, très probablement, il se révélera être une sorte d'hybride des deux systèmes.