# OptiX

Le moteur d'accélération logiciel OptiX est une interface de programmation (API) de lancer de rayons, 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, les requêtes d'intelligence artificielle et l'analyse des collisions.

## Spécificités du ray tracing

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.
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.
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érarchie des volumes englobants.
* 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)
* 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
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
* Le module complémentaire Blender D-NOISE utilise des binaires OptiX pour le débruitage accéléré par IA
* 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
* 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
* Adobe After Effects CC
* 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