OptiX

Un article de Wikipédia, l'encyclopédie libre.
Ceci est une version archivée de cette page, en date du 30 août 2020 à 07:46 et modifiée en dernier par Djiboun (discuter | contributions). Elle peut contenir des erreurs, des inexactitudes ou des contenus vandalisés non présents dans la version actuelle.
OptiX

Description de l'image OptiX Julia set.png.
Informations
Développé par NvidiaVoir et modifier les données sur Wikidata
Dernière version 7.1 ()[1]Voir et modifier les données sur Wikidata
Écrit en C++ et CVoir et modifier les données sur Wikidata
Système d'exploitation Microsoft Windows, Linux et macOSVoir et modifier les données sur Wikidata
Environnement IBM compatible PCVoir et modifier les données sur Wikidata
Type Lancer de rayonVoir et modifier les données sur Wikidata
Site web developer.nvidia.com/optixVoir et modifier les données sur Wikidata

Le moteur d'accélération logiciel OptiX est une interface de programmation (API) de lancer de rayons[2], développée par Nvidia. Les calculs sont confiés aux processeurs graphiques (GPU) par l'intermédiaire de l'API introduite avec le langage de programmation CUDA, disponible uniquement pour les cartes graphiques Nvidia. OptiX fait partie de la suite logicielle Nvidia GameWorks. C'est une API de haut niveau, "au service de l'algorithme", ce qui signifie qu'elle est conçue pour englober l'ensemble de l'algorithme dont le ray tracing fait partie, et pas seulement le ray tracing lui-même. Cela permet au moteur OptiX d'exécuter l'algorithme le plus complet avec une grande flexibilité sans avoir à modifier l'application.

Généralement, les jeux vidéo utilisent pour leur rendu la rastérisation plutôt que le lancer de rayons.

Selon Nvidia, OptiX est conçu pour être suffisamment flexible pour les «définitions de procédures et les approches de rendu hybrides». Outre le rendu infographique, OptiX facilite également la conception optique et acoustique, la recherche sur les rayonnements et l'électromagnétisme[3], les requêtes d'intelligence artificielle et l'analyse des collisions[4].

Spécificités du ray tracing

Un ensemble de Julia dessiné avec OptiX, servant également d'exemple dans le kit de développement logiciel (SDK).

OptiX fonctionne à partir d'instructions fournies par l'utilisateur (sous la forme de noyaux CUDA), relatives à l'action d'un rayon dans des circonstances particulières pour simuler un processus complet de lancer de rayons [5].

Un rayon lumineux (ou tout autre type de rayon) peut avoir un comportement différent lorsqu'il frappe une surface particulière plutôt qu'une autre. OptiX permet de personnaliser ces conditions de frappe avec des programmes fournis par l'utilisateur. Ces programmes sont écrits en CUDA C ou directement en code PTX et sont liés entre eux lorsqu'ils sont utilisés par le moteur OptiX.

Pour utiliser OptiX, le système doit disposer d'un GPU compatible avec CUDA et de la boîte à outils (toolkit) CUDA.

L'utilisation du moteur OptiX dans une application de lancer de rayons implique généralement les étapes suivantes :

  • Définition de programmes pour la génération de rayons (les rayons peuvent par exemple être tirés en parallèle, en perspective ou comme un champ de gradient), l'absence de rayon (lorsqu'un rayon ne traverse aucun objet), un programme d'exception facultatif (si le rayon ne peut pas être lancé pour une raison quelconque), un programme de boîte englobante (qui fournit un test d'intersection de boîte englobante pour un objet donné) et un programme de calcul d'intersection.

Plusieurs exemples de ces programmes sont disponibles avec le kit de développement (SDK) du programme.

// Exemple de code utilisant l'API OptiX //

/* Programme de génération de rayon */
rtProgramCreateFromPTXFile( *context, path_to_ptx, "pinhole_camera", &ray_gen_program );
rtContextSetRayGenerationProgram( *context, 0, ray_gen_program );

/* Programme d'absence de rayon */
rtProgramCreateFromPTXFile( *context, path_to_ptx, "absence", &miss_program );
rtContextSetMissProgram( *context, 0, miss_program );

/* Programme de boîte englobante et d'intersection */
rtProgramCreateFromPTXFile( context, path_to_ptx, "boite_limites", &box_bounding_box_program );
rtGeometrySetBoundingBoxProgram( *box, box_bounding_box_program );
rtProgramCreateFromPTXFile( context, path_to_ptx, "boite_intersection", &box_intersection_program );
rtGeometrySetIntersectionProgram( *box, box_intersection_program );

Les programmes de boîtes englobantes sont utilisés pour définir les volumes englobants destinés à accélérer le processus de lancer de rayons dans les structures d'accélération comme les arbres kd ou de hiérarchies de volume englobant

  • Création des programmes de frappe la plus proche (closest hit) et frappe quelconque (any hit) : ces deux programmes déterminent le comportement d'un rayon lors de sa première intersection (frappe la plus proche) ou une intersection générique (frappe quelconque)
// Exemple de code utilisant l'API OptiX //

rtProgramCreateFromPTXFile( context, path_to_ptx, "closest_hit_radiance", &closest_hit_program );
rtProgramCreateFromPTXFile( context, path_to_ptx, "any_hit_shadow", &any_hit_program );

/* Associe à une matière les programmes de frappe la plus proche et frappe quelconque */
rtMaterialCreate( context, material );
rtMaterialSetClosestHitProgram( *material, 0, closest_hit_program );
rtMaterialSetAnyHitProgram( *material, 1, any_hit_program );
  • Définition des mémoires tampons et des variables qui peuvent être utilisées dans les programmes fournis. Les mémoires tampons sont des zones de mémoire qui permettent au code hôte (le code CPU normal) de communiquer avec le code du périphérique (le code exécuté sur le GPU) et vice versa. En interne, OptiX utilise les variables pour communiquer et transférer des données dans les deux sens grâce aux mémoires tampons.
  • Définition de la hiérarchie OptiX des objets, groupes, sélecteurs et autres nœuds de géométrie pour générer un graphe arborescent de l'ensemble de la scène à restituer
Un exemple de graphe pour NVIDIA OptiX

Afin de restituer une scène complexe ou de tracer des chemins différents pour n'importe quel rayon, OptiX tire profit du calcul par GPGPU en exploitant la plateforme NVIDIA CUDA. Comme le processus de tir des rayons et la définition de leur comportement sont extrêmement personnalisables, OptiX peut être utilisé dans une multitude d'autres applications que celle du lancer de rayons.

OptiX Prime

À partir de la version 3.5.0 d'OptiX, une deuxième bibliothèque, appelée OptiX Prime, est ajoutée à l'ensemble. Elle fournit une API rapide de bas niveau pour le lancer de rayons - construction de la structure d'accélération, traversée de la structure d'accélération et intersection rayon-triangle. Prime propose également une fonction de repli vers le processeur lorsqu'aucun GPU compatible n'est trouvé sur le système. Contrairement à OptiX, Prime n'est pas une API programmable, et ne prend donc pas en charge les primitives non triangulaires et les ombrages personnalisés. N'étant pas programmable, OptiX Prime n'encapsule pas l'intégralité de l'algorithme dont le lancer de rayons fait partie. Ainsi, Prime ne peut pas recompiler l'algorithme pour de nouveaux GPU, refaçonner le calcul en fonction des performances, ou utiliser un dispositif réseau comme le Quadro VCA.

Logiciels utilisant OptiX

  • Blender prend en charge OptiX depuis la version 2.81[6]
  • Le module complémentaire Blender D-NOISE utilise des binaires OptiX pour le débruitage accéléré par IA[7]
  • FurryBall - Rendu d'images finales en qualité de production sur GPU en temps réel utilisant le lancer de rayon ainsi que la rastérisation
  • Au salon SIGGRAPH 2011, Adobe présente OptiX dans une démonstration technologique de lancer de rayons par GPU pour l'animation[8]
  • Au SIGGRAPH 2013, OptiX est présenté dans l'outil de prévisualisation d'éclairage en temps réel basé sur GPU de Pixar .
  • OptiX est intégré à la bibliothèque des développeurs de GameWorks avec PhysX et d'autres moteurs et frameworks graphiques basés sur CUDA[9]
  • Adobe After Effects CC[10]
  • Daz Studio utilisait OptiX Prime Acceleration depuis son intégration à Iray, mais la fonction a été supprimée dans la version 4.12.1.8[11]

Références

  1. « https://developer.nvidia.com/designworks/optix/download »
  2. « Scheduling in OptiX, the Nvidia ray tracing engine »,
  3. Robert Felbecker, Leszek Raschkowski, Wilhelm Keusgen et Michael Peter, 2012 6th European Conference on Antennas and Propagation (EUCAP), IEEE Xplore, , 488–492 p. (ISBN 978-1-4577-0920-3, DOI 10.1109/EuCAP.2012.6206198), « Electromagnetic wave propagation in the millimeter wave band using the NVIDIA OptiX GPU ray tracing engine »
  4. Steven G. Parker, Heiko Friedrich, David Luebke et Keith Morley, « Magazine Communications of the ACM - GPU ray tracing », Communications of the ACM, ACM,‎ (lire en ligne, consulté le )
  5. Steven G. Parker, Heiko Friedrich, David Luebke et Keith Morley, « OptiX: a general purpose ray tracing engine », ACM Transactions on Graphics (Tog), ACM,‎ (DOI 10.1145/1778765.1778803, lire en ligne, consulté le )
  6. « Blender 2.81 Benchmarks On 19 NVIDIA Graphics Cards - RTX OptiX Rendering Performance Is Incredible », phoronix.com, (consulté le )
  7. « D-NOISE: Rapid AI Denoising for Blender », Remington Creative, (consulté le )
  8. « Adobe showcasing OptiX in a technology demo for ray tracing motion graphics with GPUs », NVIDIA, (consulté le )
  9. « Nvidia announces Gameworks Program at Montreal 2013; supports SteamOS », NVIDIA, (consulté le )
  10. « GPU changes (for CUDA and OpenGL) in After Effects CC (12.1) | After Effects region of interest » (consulté le )
  11. « Daz Studio Changelog », DAZ 3D (consulté le )

Liens externes