Ray Tracing con Nvidia OptiX - fing.edu.uy
Transcript of 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
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)
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
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
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
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
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
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
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
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.
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.
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
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
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().
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.
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
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;}
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; }
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 ;}
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.
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); }
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
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}
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;
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.
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.
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
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
Modelo de programación
19/8/19 Computación Gráfica Avanzada: <Tema, por ejemplo, Hardware Gráfico> 29
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.
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.
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
Gracias por su atención