16 novembre 2021

Le raytracing dans Evergine

rendu evergine

 

Introduction

Le raytracing est une technologie qui permet d'améliorer le réalisme de notre rendu. La technologie de rendu en temps réel la plus répandue est la rastérisation, avec laquelle nous travaillons depuis longtemps à simuler tous les détails du monde, comme les différentes surfaces, la lumière, les ombres, les réflexions… Le raytracing, de son côté, est une technologie qui permet de simuler tous ces détails du monde réel avec la meilleure approximation, mais il était très coûteux à utiliser pour le rendu en temps réel.

En 2018, Nvidia a lancé sa nouvelle série de cartes graphiques dotées de la technologie RTX, qui utilise le matériel pour réduire le coût de calcul du raytracing. Cela permet d'utiliser le raytracing en temps réel et offre une bonne alternative à la technologie traditionnelle de rastérisation.

Certains effets visuels, comme les ombres douces, les réflexions en temps réel ou l'illumination globale, sont difficiles à implémenter avec la rastérisation traditionnelle, alors qu'il est possible de les obtenir avec une implémentation relativement plus simple grâce au raytracing.

Au cours des années suivantes, 2019, 2020 et 2021, le ray tracing s'est étendu à d'autres fabricants de cartes graphiques comme AMD ou Intel, l'objectif étant qu'il devienne la technologie standard à l'avenir.

La technologie de raytracing est prise en charge dans Evergine dans le cadre de son API bas niveau. L'API bas niveau est une interface commune aux principales API graphiques, comme DX12, DX11, Metal, Vulkan ou OpenGL. Pour l'instant, la prise en charge du raytracing n'est toutefois disponible que sur les backends DirectX12 et Vulkan.

L'équipe Evergine a unifié les API DXR de DirectX12 et Vulkan Raytracing en une seule API commune. Vous pouvez ainsi écrire un projet avec l'API bas niveau d'Evergine et l'exécuter ensuite sur les backends DX12 ou Vulkan.

Pour montrer les possibilités de l'API bas niveau de raytracing d'Evergine, nous avons créé, à l'occasion du lancement d'Evergine, une démo de path tracer que vous pouvez télécharger sur Github. Cette démo comprend plusieurs effets intéressants, comme les ombres douces, l'occlusion ambiante, l'illumination globale et l'anticrénelage, implémentés grâce au raytracing.

La section suivante explique comment chacun de ces effets a été implémenté :

effets evergine

Tout d'abord, la caméra lance un seul rayon par pixel ; chaque rayon peut toucher une surface ou non. Si le rayon touche une surface, la couleur résultante provient du matériau de la surface ; sinon, le résultat est la couleur d'arrière-plan.

Ombres douces

Pour implémenter des ombres par raytracing, il faut lancer un nouveau rayon depuis chaque point d'impact sur une surface vers la lumière. Si ce nouveau rayon entre en collision avec un objet avant d'atteindre la lumière, il renvoie la valeur « dans l'ombre » ; sinon, il renvoie la valeur « dans la lumière ».

ombres evergine

C'est le cas le plus simple, qui produit des ombres dures ; pour obtenir des ombres douces, il faut aller un peu plus loin. Notre implémentation consiste à lancer plusieurs rayons depuis chaque point de la surface vers la lumière (dans cette démo, nous n'utilisons qu'une seule source lumineuse). Par souci de simplicité, la lumière est sphérique et les rayons sont lancés depuis le point d'impact sur la surface vers la lumière en formant un cône.

La couleur de l'ombre dépend alors du résultat combiné de chaque rayon. Les zones de pénombre apparaissent lorsque certains rayons renvoient « dans l'ombre » et d'autres « dans la lumière ».

cône d'ombre douce

L'image suivante permet de voir les zones de pénombre en comparant les ombres produites par la lumière avec différents rayons de source lumineuse.

Ombre douce

Occlusion ambiante

L'occlusion ambiante simule les zones qui ont tendance à bloquer ou occulter la lumière en raison de la proximité d'un objet, et qui apparaissent donc plus sombres.

Notre implémentation de l'occlusion ambiante consiste à lancer plusieurs rayons courts depuis le point d'impact sur la surface, dans un hémisphère aligné sur la normale de la surface. Comme les rayons d'ombre, ces rayons détectent si un objet est proche du point et occulte les rebonds de lumière.

occlusion ambiante

L'image suivante montre le résultat obtenu avec différentes longueurs de rayons d'occlusion ambiante :

AO3 evergine

Illumination globale

Le comportement de la lumière dans le monde réel peut être simulé en émettant depuis la source lumineuse des rayons qui touchent une surface. Une partie de l'énergie du rayon est absorbée par la surface et une autre est réfléchie, créant un nouveau rayon, de manière récursive, jusqu'à ce que toute l'énergie du rayon initial soit absorbée.

illumination globale

Un paramètre de rebonds permet de simuler le nombre de fois qu'un rayon lumineux peut être réfléchi par les surfaces. La couleur obtenue à chaque rebond s'ajoute à la couleur de la surface : par exemple, un objet rouge proche d'un autre contribue à teinter de rouge l'objet voisin.

L'image suivante montre le résultat de l'illumination globale, où certaines zones sont teintées par les couleurs des objets voisins.

GI2 evergine

Anticrénelage

L'anticrénelage consiste à supprimer l'effet d'escalier de l'image. Cet effet est dû à la grille de pixels limitée de l'image de sortie.

Pour y parvenir, il faut lancer plusieurs rayons par pixel depuis la caméra et obtenir une couleur moyenne comme résultat. Lorsqu'un seul rayon est lancé par pixel, la caméra lance un rayon aligné sur le centre du pixel. Pour implémenter l'anticrénelage, plusieurs rayons sont lancés par pixel dans une direction aléatoire à l'intérieur du pixel. Dans notre implémentation, nous utilisons une séquence de Halton, couramment employée à cet effet.

Anticrénelage evergine

L'image suivante montre le résultat de la combinaison de plusieurs rayons par pixel :

Séquence de Halton evergine

Travaux à venir

Aujourd'hui, le raytracing est une technologie en constante évolution, mais le résultat actuel est très impressionnant et supérieur à celui du rendu par rastérisation. Tous les moteurs graphiques modernes sont en train de mettre à jour leur rendu pour utiliser le raytracing, mais le coût d'intégration est élevé et, afin de continuer à prendre en charge les anciennes cartes graphiques, le raytracing n'est qu'une option. Bon nombre de moteurs modernes implémentent un rendu hybride combinant rastérisation et raytracing.

Evergine est le premier moteur C# à intégrer le raytracing. Notre objectif est d'offrir à nos utilisateurs les dernières technologies graphiques pour leurs projets ou produits industriels.

Conformément à notre feuille de route, nous continuerons à travailler sur le raytracing afin de l'intégrer à notre API haut niveau et de proposer également son intégration dans Evergine Studio.

Jorge Canton
Auteur
Jorge Cantón
Plain Concepts Research