Dadas las confusiones del artículo anterior, más que nada producidas por la falta de información básica, creo que es importante aclarar y/o complementar una serie de elementos.

En primer lugar ningún sistema en la actualidad realiza Ray Tracing como método de universal y único de renderizado, aunque bien es posible aplicar el trazado de rayos para dibujar la escena, este es visualmente ineficiente si renderizamos solo con luz directa y empieza a brillar cuando utilizamos iluminación indirecta, ergo el renderizado híbrido que consiste en que solo se trazan rayos para solucionar problemas visuales que la rasterización no puede solventar.

El otro punto es que en el trazado de rayos habitual un rayo podría estar rebotando indefinidamente de un objeto a otro de manera indefinida, por lo que se utilizan varias técnicas para que esto no ocurra, obviamente en todas ellas si el rayo sale de escena es destruido.

  • Se marca un límite de rebotes por rayo, una vez ha superado dicho límite el rayo se destruye.
  • Se crea un cociente de refracción en cada objeto que es un valor entre 0 y 1 que marca cuanto absorbe la luz. Una superficie muy reflectante tendrá un valor 1 y una que no tendrá un valor cercano al 0. Los rayos indirectos por impactar por la superficie saldrán con una «energía» más baja o igual, pero nunca más alta. Cuando el valor de un rayo es demasiado bajo se destruye.

¿Se utiliza esta técnica en el Ray Tracing que vemos en las consolas en la actualidad? Pues no y solo hace falta ver el pipeline general de las extensiones para dicha técnicas en todas las API gráficas:

TraceRay() en este caso es una función que tiene que ser llamada, dicho de otra manera por cada objeto que hay en escena no se produce un rebote de luz a no ser que se lo digamos explícitamente en el código. Para que lo entendáis el Ray Tracing en la actualidad no se genera para todos los objetos en pantalla, solo para unos elegidos por el desarrollador.

Veamos lo que dice la documentación de DirectX Ray Tracing.

A shader that calls TraceRay to generate rays. The initial user-defined ray payload for each ray is provided to the TraceRay call site. CallShader may also be used in ray generation shaders to invoke callable shaders.

DispatchRays invokes a grid of ray generation shader invocations. Each invocation (thread) of a ray generation shader knows its location in the overall grid, can generate arbitrary rays via TraceRay, and operates independently of other invocations. There is no defined order of execution of threads with respect to each other.

En cuanto a TraceRay

Sends a ray into a search for hits in an acceleration structure.

Dado que el renderizado es híbrido no hablamos de un rebote de la luz en el objeto, el rasterizado no emite rayos, sino que a partir de una imagen renderizada solo con iluminación directa lo que se hace es generar rayos de los objetos para simular la iluminación indirecta, por lo que cada uno de ellos se ha de invocar en cada objeto de la escena.

¿El motivo? Los sistemas no tienen suficiente potencia para realizar el Ray Tracing a gran escala en cada escena.