ray tracing con nvidia optix - fing.edu.uy

33
Ray Tracing con Nvidia OptiX Computación Gráfica Avanzada Ingeniería en Computación Facultad de Ingeniería – Universidad de la República Ignacio Decia

Upload: others

Post on 06-Jul-2022

7 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Ray Tracing con Nvidia OptiX - fing.edu.uy

Ray Tracing con Nvidia OptiX

Computación Gráfica Avanzada Ingeniería en Computación

Facultad de Ingeniería – Universidad de la República

Ignacio Decia

Page 2: Ray Tracing con Nvidia OptiX - fing.edu.uy

Introducción

¿Qué es OptiX? §  Biblioteca para el desarrollo de aplicaciones basadas en trazado

de rayos.

§  Ejecuta sobre procesadores gráficos (GPUs) Nvidia.

§  Explota el paralelismo masivo de estas arquitecturas.

19/8/19 Computación Gráfica Avanzada: <Tema, por ejemplo, Hardware Gráfico> 2

Geforce  GTX  1080  Ti  (3584  cores)  

Page 3: Ray Tracing con Nvidia OptiX - fing.edu.uy

Aplicaciones

§  Aplicaciones generales: §  Estimación de volúmenes de sólidos. §  Detección de collisiones. §  Propagación del sónido. §  Visualización científica.

19/8/19 3 Computación Gráfica Avanzada: <Tema, por ejemplo, Hardware Gráfico>

Nvidia VRWorks Audio Visualización de tejidos Planificación de ruta

Page 4: Ray Tracing con Nvidia OptiX - fing.edu.uy

Aplicaciones

§  Aplicaciones gráficas: -  Algoritmos fotorealistas (Path Tracing, Bidirectional Path

Tracing, Photon Mapping, etc).

19/8/19 Computación Gráfica Avanzada: <Tema, por ejemplo, Hardware Gráfico> 4

Page 5: Ray Tracing con Nvidia OptiX - fing.edu.uy

Conceptos Básicos

¿Cómo usar OptiX en nuestra aplicación? §  Hay que implementar un conjunto de

procedimientos (GPU Kernels), llamados OptiX Programs.

§  Entre los más importantes están: §  Ray Generation Program. §  Closest Hit Program. §  Any Hit Program. §  Miss Program. §  Intersection Program.

19/8/19 Computación Gráfica Avanzada: <Tema, por ejemplo, Hardware Gráfico> 5

Page 6: Ray Tracing con Nvidia OptiX - fing.edu.uy

Conceptos Básicos

Ray Generation Program §  Define como se generan los rayos primarios. §  Al ejecutar la aplicación, OptiX crea multiples

instancias de este programa que se ejecutan en hilos independientes y en paralelo.

§  En general, cada instancia traza varios rayos primarios.

18/8/19 Computación Gráfica Avanzada: <Tema, por ejemplo, Hardware Gráfico> 6

Pinhole Sensor

dA

Page 7: Ray Tracing con Nvidia OptiX - fing.edu.uy

Conceptos Básicos

Closest Hit Program §  Se invoca cuando se encuentra la intersección más

cercana de un rayo con la geometría.

18/8/19 Computación Gráfica Avanzada: <Tema, por ejemplo, Hardware Gráfico> 7

Page 8: Ray Tracing con Nvidia OptiX - fing.edu.uy

Conceptos Básicos

Any Hit Program §  Se invoca para cada intersección del rayo con la

geometría.

18/8/19 Computación Gráfica Avanzada: <Tema, por ejemplo, Hardware Gráfico> 8

Page 9: Ray Tracing con Nvidia OptiX - fing.edu.uy

Conceptos Básicos

Miss program §  Se invoca cuando el rayo trazado no choca con la

geometría.

18/8/19 Computación Gráfica Avanzada: <Tema, por ejemplo, Hardware Gráfico> 9

Page 10: Ray Tracing con Nvidia OptiX - fing.edu.uy

Conceptos Básicos

19/8/19 Computación Gráfica Avanzada: <Tema, por ejemplo, Hardware Gráfico> 10

Estructuras de aceleración §  OptiX provee estructuras de aceleración para hacer

eficiente el test de intersección de rayo con geometría.

Page 11: Ray Tracing con Nvidia OptiX - fing.edu.uy

Conceptos básicos

18/8/19 Computación Gráfica Avanzada: <Tema, por ejemplo, Hardware Gráfico> 11

Modelo de ejecución §  Solo las cajas amarillas son programadas por el

usuario. El resto son controladas internamente por OptiX.

Page 12: Ray Tracing con Nvidia OptiX - fing.edu.uy

Modelo de programación

Ray Generation Program §  Se crean múltiples instancias de este programa que

ejecutan en paralelo.

§  La cantidad de instancias se especifica en la llamada rtContextLaunch2D().

§  Cada instancia traza uno (o más) rayos primarios.

§  Al finalizar el camino del rayo, el programa escribe los resultados en un buffer de salida.

18/8/19 Computación Gráfica Avanzada: <Tema, por ejemplo, Hardware Gráfico> 12

Page 13: Ray Tracing con Nvidia OptiX - fing.edu.uy

Modelo de programación

Ejemplo: Camara Pinhole §  Se crea una instancia por cada pixel. §  Cada instancia se encarga de trazar uno o varios

rayos primarios por el píxel. §  Los rayos de diferentes píxeles son trazados en

paralelo.

19/8/19 Computación Gráfica Avanzada: <Tema, por ejemplo, Hardware Gráfico> 13

Page 14: Ray Tracing con Nvidia OptiX - fing.edu.uy

Modelo de programación

RT_PROGRAM void pinhole_camera() { size_t2 screen = output_buffer.size(); float2 d = make_float2(launch_index) /make_float2(screen) * 2.f - 1.f; float3 ray_origin = eye; float3 ray_direction = normalize(d.x*U + d.y*V + W); optix::Ray ray(ray_origin, ray_direction, radiance_ray_type, scene_epsilon ); PerRayData_radiance prd; prd.depth = 0; rtTrace(top_object, ray, prd); output_buffer[launch_index] = make_color( prd.color );}

19/8/19 Computación Gráfica Avanzada: <Tema, por ejemplo, Hardware Gráfico> 14

Ejemplo: Camara Pinhole

§  Cada hilo se identifica con la variable launch_index, que se mapea a un pixel.

§  Se crea un rayo con origen en la cámara que pasará por el pixel

correspondiente.

§  Para trazar el rayo se invoca a la llamada a rtTrace().

Page 15: Ray Tracing con Nvidia OptiX - fing.edu.uy

Modelo de programación

RT_PROGRAM void pinhole_camera() { size_t2 screen = output_buffer.size(); float2 d = make_float2(launch_index) /make_float2(screen) * 2.f - 1.f; float3 ray_origin = eye; float3 ray_direction = normalize(d.x*U + d.y*V + W); optix::Ray ray(ray_origin, ray_direction, radiance_ray_type, scene_epsilon ); PerRayData_radiance prd; prd.depth = 0; rtTrace(top_object, ray, prd); output_buffer[launch_index] = make_color( prd.color );}

19/8/19 Computación Gráfica Avanzada: <Tema, por ejemplo, Hardware Gráfico> 15

Ejemplo: Camara Pinhole

§  Un rayo puede tener asociado un Payload que almacena información. Por ejemplo, color de la superficie donde interseca.

§  El Payload es pasado en la llamada a rtTrace(). Antes de la misma la

estructura esta sin inicializar.

§  Al finalizar la llamada a rtTrace(), el Payload es retornado y el programa escribe el color resultado en el output_buffer.

Page 16: Ray Tracing con Nvidia OptiX - fing.edu.uy

Modelo de programación

§  Se invoca a closest_hit_program() para la intersección del rayo con la geometría más cercana.

§  En este programa típicamente hace cálculos que

determinan el color y que dependen del material de la superficie.

§  En general, por cada tipo de superficie habrá una versión

diferente del programa.

19/8/19 Computación Gráfica Avanzada: <Tema, por ejemplo, Hardware Gráfico> 16

Closest Hit Program

Page 17: Ray Tracing con Nvidia OptiX - fing.edu.uy

Modelo de programación

Ejemplo: Closest Hit para material perfectamente especular.

19/8/19 Computación Gráfica Avanzada: <Tema, por ejemplo, Hardware Gráfico> 17

RT_PROGRAM void specular_closest_hit(){ float3 R = optix::reflect(ray.direction, ffnormal); Ray refl_ray(hit_point, R, radiance_ray_type, scene_epsilon); rtTrace(top_object, refl_ray, refl_prd); color += reflectivity * refl_prd.color; prd_radiance.color = color;}

Page 18: Ray Tracing con Nvidia OptiX - fing.edu.uy

Modelo de programación  

Ejemplo: Closest Hit para material difuso.      

19/8/19   Computación  Gráfica  Avanzada:  <Tema,  por  ejemplo,  Hardware  Gráfico>   18  

RT_PROGRAM void diffuse_closest_hit(){ float3 hit_point = ray.origin + t_hit * ray.direction; float3 color = photon_map_indirect_light(hit_point, -ray.direction); for (int i = 0; i < lights.size(); ++i) { Light light = lights[i]; float3 L = normalize(light.pos - hit_point); ShadowPayload sp; sp.attenuation = 1.0f;

Ray shadowRay = make_Ray(hit.position, L, RayType::SHADOW, 0.01, tMax); rtTrace(root, shadowRay, sp); if (shadowPayload.attenuation > 0.0f) float nDl = dot(ffnormal, L); if (nDl > 0) color += Kd * nDl * light.color; } }

} prd_radiance.result = color; }

Page 19: Ray Tracing con Nvidia OptiX - fing.edu.uy

Modelo de programación

Any Hit Program

§  Se invoca a any_hit() por cada intersección del rayo con la geometría.

19/8/19 Computación Gráfica Avanzada: <Tema, por ejemplo, Hardware Gráfico> 19

RT_PROGRAM void any_hit()

{ if (opacity == 1.0f) { prd_shadow.attenuation = make_float3(0.0f); rtTerminateRay(); } else rd_shadow.attenuation *= opacity ;}

Page 20: Ray Tracing con Nvidia OptiX - fing.edu.uy

Modelo de programación

Any Hit Program

19/8/19 Computación Gráfica Avanzada: <Tema, por ejemplo, Hardware Gráfico> 20

RT_PROGRAM void any_hit(){ if (opacity == 1.0f) { prd_shadow.attenuation = make_float3(0.0f); rtTerminateRay(); } else rd_shadow.attenuation *= opacity ;}

•  En general, se utiliza para el chequeo de visibilidad y rayos de sombra.

•  Las intersecciones pueden ser terminadas por el programa invocando rtTerminateRay(). Muy útil cuando se hace chequeo de visibilidad y se choca con un objeto opaco.

Page 21: Ray Tracing con Nvidia OptiX - fing.edu.uy

Modelo de programación

Miss Program §  Cuando termina la búsqueda de intersecciones y no se

encuentra una se invoca este programa. §  Se utiliza generalmente para implementar un

EnvironmentalMap que representa un cielo.

19/8/19 Computación Gráfica Avanzada: <Tema, por ejemplo, Hardware Gráfico> 21

RT_PROGRAM void miss() { prd_radiance.color = SkyColor(ray.direction); }

Page 22: Ray Tracing con Nvidia OptiX - fing.edu.uy

Modelo de programación

Intersection Program §  Implementa la intersección de un rayo con una primitiva: esfera,

triangulo, malla de triángulos. §  El código para el test de intersección es provisto por el usuario y

debe implementarse en RT_PROGRAM void intersect(int primIdx).

§  Para cada primitiva debe implementar un bounding box RT_PROGRAM void boundingBox(int primIdx, floart result[6]).

§  Si el rayo efectivamente interseca con la primitiva entonces se

reporta la intersección invocando la función rtReportIntersection(idMaterial). Observar que a esta función recibe por parámetro el ID del material correspondiente a la primitiva. En caso de que la intersección sea la más cercana al origen del rayo, luego se invocará el closest_hit asociado al material correspondiente.

19/8/19 Computación Gráfica Avanzada: <Tema, por ejemplo, Hardware Gráfico> 22

Page 23: Ray Tracing con Nvidia OptiX - fing.edu.uy

Modelo de programación

DataPayload •  Estructura de datos utilizada para el pasaje e

intercambio de información entre los programas. •  Puede ser diferente según el tipo de rayo.

19/8/19 Computación Gráfica Avanzada: <Tema, por ejemplo, Hardware Gráfico> 23

struct ShadowRayData{

float attenuation;}

struct RadianceRayData{

float3 color}

Page 24: Ray Tracing con Nvidia OptiX - fing.edu.uy

Modelo de programación

Buffers §  Es posible reservar buffers multidimensionales. §  El buffer más utilizado es el buffer bidimensional de

imagén.

19/8/19 Computación Gráfica Avanzada: <Tema, por ejemplo, Hardware Gráfico> 24

rtBuffer<float3, 2> output_buffer;

§  Otro buffer comúnmente empleado son los buffers para representar mallas triangulares.

rtBuffer<float3> vertexBuffer;rtBuffer<float3> normalBuffer;rtBuffer<int3> indexBuffer;

Page 25: Ray Tracing con Nvidia OptiX - fing.edu.uy

Modelo de programación  

Variables  §  El  usuario  puede  definir  variables  globales  que  pueden  ser  accedidas  

por  los  disPntos  programas.  Las  variables  pueden  ser  de  Ppos  de  datos  simples  o  registos  de  Ppo  struct.  

§  Ejemplos:  

       

 

19/8/19   Computación  Gráfica  Avanzada:  <Tema,  por  ejemplo,  Hardware  Gráfico>   25  

§  rtDeclareVariable(float3, eye, , );

§  rtDeclareVariable(float3, lookAt, , );

§  rtDeclareVariable(HitRecor, hit, , ); §  //Struct seteado por el intersection_program con la

información del punto intersecado y la normal.

 

   

Page 26: Ray Tracing con Nvidia OptiX - fing.edu.uy

Modelo de programación

Variables §  También existen variables definidas por OptiX. Algunas

son sólo accesibles parra algunos programas.

19/8/19 Computación Gráfica Avanzada: <Tema, por ejemplo, Hardware Gráfico> 26

§  rtDeclareVariable(uint2, launch_index, rtLaunchIndex, );//Contiene el identificador del thread en la grilla de ejecución.

§  rtDeclareVariable(rtObject, scene_root_group, , ); //Define el nodo raiz del grafo de la escena. Esta variable puede pasarse por parametro a rtTrace() si se quiere chequear por intersecciones del rayo con la escena completa.

§  rtDeclareVariable(Ray, ray, rtCurrentRay, ); //Es utilizada por el intersection_program, closest_hit_program, etc. Permite obtener el origen y la dirección del rayo actual.

Page 27: Ray Tracing con Nvidia OptiX - fing.edu.uy

Modelo de programación

§  La escena es representada en un grafo. §  Los nodos principales del grafo son:

§  Group. §  Geometry Group. §  Geometry Instance. §  Geometry. §  Material.

§  Group: contienen cero o mas nodos de tipo Group o Geometry Group. Pueden tener asociada una estructura de aceleración.

§  Geometry Group: estos nodos contienen a a nodos del tipo Geometry Instance. Pueden tener asociada una estructura de aceleración.

19/8/19 Computación Gráfica Avanzada: <Tema, por ejemplo, Hardware Gráfico> 27

Page 28: Ray Tracing con Nvidia OptiX - fing.edu.uy

Modelo de programación

§  La escena es representada en un grafo. §  Los nodos principales del grafo son:

§  Group. §  Geometry Group. §  Geometry Instance. §  Geometry. §  Material.

§  Geometry Instance: formado por un nodo Geometry y nodos Material. Este nodo representa a un objeto completamente, el cuál esta formado por una geometría y un conjunto de materiales.

§  Geometry: contiene una lista de primitivas. Puede representar una esfera, triangulo, cuadrilatero, malla de triangulos, parche de bezier, etc. Tiene aosciado un interesction_program que define la intersección de un rayo con una primitiva.

§  Material: define la información de sombreado. Por cada tipo de rayo distinto, un material puede tener asociado un closest_hit o un any_hit program diferente. Por ejemplo, un material difuso opaco puede tener asociado un any_hit para un rayo de sombra. En caso de que un rayo de sombra intersecte con el objeto con este material, él que se encargará se setear la visibilidad del payload en false. En cambio si la intersección mas cercana un rayo de color se intersecta con el mismo objeto, se invocara al closest_hit del material.

19/8/19 Computación Gráfica Avanzada: <Tema, por ejemplo, Hardware Gráfico> 28

Page 29: Ray Tracing con Nvidia OptiX - fing.edu.uy

Modelo de programación  

19/8/19   Computación  Gráfica  Avanzada:  <Tema,  por  ejemplo,  Hardware  Gráfico>   29  

   

Page 30: Ray Tracing con Nvidia OptiX - fing.edu.uy

Modelo de programación

19/8/19 Computación Gráfica Avanzada: <Tema, por ejemplo, Hardware Gráfico> 30

Estructuras de aceleración •  OptiX provee diferentes estructuras de aceleración

que pueden asociarse a los nodos GeometryGroup y Group.

•  Las estructuras se diferencian por: –  Tiempo de construcción/actualización. –  Tiempo de consulta.

•  Dependiendo del tipo de escena convendrá una u otra.

•  También es posible soluciones híbridas.

Page 31: Ray Tracing con Nvidia OptiX - fing.edu.uy

Modelo de programación

19/8/19 Computación Gráfica Avanzada: <Tema, por ejemplo, Hardware Gráfico> 31

Algunas de las estructuras son: §  NoAccel: Estructura de aceleración vacía. Puede ser útil

cuando la escena es dinámica y la geometría es muy pequeña.

§  BVH: jerarquía de volúmenes acotantes clásica. Tiempo de consulta bueno, pero construcción lenta.

§  SBVH: logra la jerarquía de mejor calidad a costo de tiempos de construcción altos. En general, es la elegida para escenas estáticas.

§  TRBVH: logra tiempos de construcción rápidos y logra tiempos de consulta un poco por debajo del SBVH. Es la elegida para escenas dinámicas. En algunos caso incluso es mejor que el SBVH para escenas estáticas.

Page 32: Ray Tracing con Nvidia OptiX - fing.edu.uy

Referencias

§  OptiX: A General Purpose Ray Tracing Engine, Parker et. al.

§  Nvidia OptiX 6.0 Programming Guide.

§  https://devblogs.nvidia.com/nvidia-optix-ray-tracing-powered-rtx/

§  http://on-demand.gputechconf.com/gtc/2013/presentations/S3474-Ray-Tracing-with-OptiX-Tutorial.pdf

§  http://on-demand.gputechconf.com/gtc/2017/presentation/s7455-martin-stich-optix.pdf

§  http://on-demand.gputechconf.com/gtc/2018/presentation/s8518-an-introduction-to-optix.pdf

19/8/19 Computación Gráfica Avanzada: <Tema, por ejemplo, Hardware Gráfico> 32

Page 33: Ray Tracing con Nvidia OptiX - fing.edu.uy

Gracias por su atención