Los RT Cores son una pieza de hardware que NVIDIA implementó a partir de la serie de tarjetas gráficas RTX 2000, y su trabajo principal consiste en acelerar el Ray Tracing, pero al mismo tiempo es una pieza casi tan eficiente como misteriosa. ¿Qué es esta pieza de hardware y cómo funciona? ¿Qué ventajas aporta? Os lo explicamos de manera rápida y sencilla.
El trabajo de los RT Cores es muy simple, se encargan de calcular la intersección que se produce entre los rayos y los objetos de la escena, pero esta definición es demasiado simple para explicar todo el proceso que realiza esta pieza de hardware. Pero antes de pasar a hablar de los RT Cores, empecemos por el principio.
¿Qué es el Ray Tracing?
Ray Tracing es una tecnología que basa su funcionamiento en el trazado de los rayos de luz en una escena basándose en los objetos de la misma.
Los primeros rayos que se ejecutan son los llamados Primary Rays (rayos primarios) o más conocidos como “Eye Rays” o “Camera Rays”; estos sirven para comprobar la visibilidad de la escena, es decir, que objetos son visibles desde el punto de vista de la cámara (el punto de vista del usuario). El problema de ello es que la forma más primitiva del algoritmo obliga a que tengamos que tirar un rayo desde la cámara hacia cada uno de los píxeles de la escena, lo cual es altamente ineficiente, es por ello que se utilizan mecanismos mucho más simples.
Bounding Volume Hierarchy, la optimización de la escena
Lo mejor es organizar la geometría de la escena en una estructura de datos espacial que nos servirá para acelerar el proceso, siendo la más utilizada a día de hoy la llamada Bounding Volume Hierarchy o BVH.
La idea es tener un mapa tridimensional de cómo está organizada la geometría en la escena en el actual fotograma:
La cual se organiza en forma de árbol:
Los objetos marcados con números son las cajas que contienen otras cajas y los triángulos que forman la geometría 3D de la escena. Los triángulos siempre se encuentran en el último nivel del árbol binario. En el ejemplo están marcados con letras para identificarlos mejor y diferenciarlos de las cajas.
El BVH de la escena se crea teniendo en cuenta la posición de los objetos respecto a la cámara, no obstante, se pueden crear otros BVH con relación a los rayos indirectos, producto del rebote de la luz sobre un objeto. En ese caso se creará otro BVH en el que se reorganizará el BVH tomando el objeto que crea el rayo indirecto como punto de origen.
Funcionalidad de los RT Cores
Una vez que hemos definido el BVH ya podemos definir lo que es el RT Core: un tipo de unidad encargada de recorrer el árbol BVH de manera continuada, recorriendo todos los caminos distintos que hay en el árbol para dar una respuesta de cada uno de ellos.
Para que lo podáis visualizar mejor, tomando el árbol de más arriba como ejemplo los caminos que recorrería el RT Core serían los siguientes:
- 1 → 3 → a
- 1 → 3 → b
- 1 → 3 → c
- 1 → 2 → 4 → d
- 1 → 2 → 4 → e
- 1 → 2 → 5 → f
- 1 → 2 → 5 → g
No obstante, según el tipo de nodo del árbol en el que se encuentre el RT Core a la hora de recorrer la escena, dependiendo si es una caja o es una primitiva, se aplicará un cálculo de la intersección u otro. Es por ello que los RT Cores tienen dos tipos de unidades para calcular la intersección: una para las cajas que es mucho más simple y otra para las primitivas.
En realidad, de cara al trazado de rayos solo importa la intersección entre el rayo y la primitiva/objeto, ya que las cajas solo son una forma de organizar la geometría de la escena. Es precisamente la intersección con rayo/primitiva la que informará del tipo de intersección que ha producido el rayo con el objeto y qué tipo de Shader se ejecutará para manipular las propiedades visuales del objeto, si bien es cierto que esto no es trabajo del RT Core, ya que este simplemente informa si hay intersección o no y de qué forma, por lo que su trabajo está limitado a dicha tarea.