# OptiX

Nvidia OptiX (Motor de Aceleración de Aplicaciones OptiX) es una API de trazado de rayos que se desarrolló por primera vez alrededor de 2009. Los cálculos se descargan en las GPU a través de la API de bajo o alto nivel introducida con CUDA. CUDA solo está disponible para los productos gráficos de Nvidia. Nvidia OptiX es parte de Nvidia GameWorks. OptiX es una API de alto nivel o "para el algoritmo", lo que significa que está diseñada para encapsular todo el algoritmo del que forma parte el trazado de rayos, no solo el trazado de rayos en sí. Esto está destinado a permitir que el motor OptiX ejecute el algoritmo más grande con gran flexibilidad sin cambios en el lado de la aplicación.
Comúnmente, los videojuegos usan la rasterización en lugar del trazado de rayos para su renderizado.
Según Nvidia, OptiX está diseñado para ser lo suficientemente flexible para "definiciones de procedimientos y enfoques de renderizado híbrido". Además de la representación de gráficos por computadora, OptiX también ayuda en el diseño óptico y acústico, la investigación electromagnética y de radiación, consultas de inteligencia artificial y análisis de colisiones.

## Trazado de rayos con OptiX

OptiX funciona mediante el uso de instrucciones proporcionadas por el usuario (en forma de núcleos CUDA) con respecto a lo que debe hacer un rayo en circunstancias particulares para simular un proceso de rastreo completo.
Un rayo de luz (o quizás otro tipo de rayo) puede tener un comportamiento diferente cuando golpea una superficie en particular en lugar de otra, OptiX permite personalizar estas condiciones de impacto con programas proporcionados por el usuario. Estos programas están escritos en CUDA C o directamente en código PTX y están vinculados entre sí cuando los utiliza el motor OptiX.
Para usar OptiX, debe haber disponible una GPU compatible con CUDA en el sistema y debe estar instalado el kit de herramientas CUDA.
El uso del motor OptiX en una aplicación de trazado de rayos generalmente implica los siguientes pasos:
* Definición de programas para la generación de rayos (p. ej., los rayos se pueden disparar en paralelo, en perspectiva o como un campo degradado), rayos perdidos (cuando un rayo no interseca ningún objeto), un programa de excepción opcional (cuando el rayo no se puede disparar por alguna razón), un programa de cuadro delimitador (el programa que proporciona una prueba de intersección de cuadro delimitador para un objeto dado) y un programa de intersección.
Varios ejemplos de estos programas están disponibles con el SDK del programa
Los programas de cuadro delimitador se utilizan para definir volúmenes delimitadores utilizados para acelerar el proceso de trazado de rayos dentro de estructuras de aceleración como árboles kd o jerarquías de volumen delimitador
* Programas de creación de material de cualquier golpe y golpe más cercano: estos dos programas determinan el comportamiento de un rayo cuando se encuentra con su primera intersección (golpe más cercano) o una intersección genérica (cualquier golpe)
* Defina buffers, variables que podrían usarse dentro de los programas suministrados. Los búferes son áreas de memoria que permiten que el código del host (es decir, el código normal de la CPU) se comunique con el código del dispositivo (es decir, el código que se ejecuta en la GPU) y viceversa. Las variables son la forma interna de OptiX de comunicarse y usar búferes para transferir datos de un lado a otro.
* Defina la jerarquía OptiX de objetos geométricos, grupos, selectores y otros nodos para generar un gráfico de árbol de toda la escena que se representará
Para renderizar una escena compleja o trazar diferentes caminos para cualquier rayo, OptiX aprovecha la computación GPGPU al explotar la plataforma NVIDIA CUDA. Dado que el proceso de disparar rayos y configurar su comportamiento es altamente personalizable, OptiX se puede usar en una variedad de otras aplicaciones además del trazado de rayos.

## OptiX Prime

A partir de OptiX 3.5.0, se agregó al paquete una segunda biblioteca llamada OptiX Prime que tiene como objetivo proporcionar una API rápida de bajo nivel para el trazado de rayos: construir la estructura de aceleración, atravesar la estructura de aceleración y la intersección del triángulo de rayos. Prime también cuenta con un respaldo de CPU cuando no se encuentra una GPU compatible en el sistema. A diferencia de OptiX, Prime no es una API programable, por lo que carece de soporte para primitivos y sombreados personalizados que no sean triangulares. Al no ser programable, OptiX Prime no encapsula todo el algoritmo del que forma parte el trazado de rayos. Por lo tanto, Prime no puede volver a compilar el algoritmo para nuevas GPU, refactorizar el cálculo para el rendimiento o usar un dispositivo de red como Quadro VCA, etc.

## Software usando OptiX

* Blender tiene soporte OptiX desde la versión 2.81 (7.1 en 2.92)
* El complemento de Blender D-NOISE utiliza binarios OptiX para la eliminación de ruido acelerada por IA
* FurryBall: Procesador avanzado de fotogramas finales con calidad de producción de GPU en tiempo real que utiliza trazado de rayos y rasterización, basado en Nvidia OptiX.
* En SIGGRAPH 2011, Adobe presentó OptiX en una demostración de tecnología de GPU ray tracing para gráficos en movimiento.
* En SIGGRAPH 2013, OptiX se presentó en la herramienta de vista previa de iluminación basada en GPU en tiempo real de Pixar.
* OptiX se ha integrado en la biblioteca de desarrolladores de GameWorks junto con PhysX y otros motores y marcos de gráficos con tecnología CUDA.
* Adobe After Effects CC
* Daz Studio tenía OptiX Prime Acceleration desde su integración con Iray, sin embargo, el soporte se eliminó en la versión 4.12.1.8
* Luxrender 2.5: hasta un 600 % de aceleración