¿Es imposible la reflexión y la refracción sin un trazado de rayos recursivo?

Estoy escribiendo un renderizador de trazado de rayos en tiempo real basado en GPU usando un sombreador de cálculo GLSL. Hasta ahora, funciona muy bien, pero me he encontrado con un problema aparentemente irresoluble cuando se trata de tener reflejos y refracciones simultáneamente.

Mi lógica me dice que para tener reflejos y refracciones en un objeto, como el vidrio, el rayo tendría que dividirse en dos, un rayo se refleja en la superficie y el otro se refracta a través de la superficie. Los colores finales de estos rayos se combinarían en función de alguna función y, en última instancia, se utilizarían como el color del píxel del que se originó el rayo. El problema que tengo es que no puedo dividir los rayos en el código de sombreador, ya que tendría que usar la recursión para hacerlo. Según tengo entendido, las funciones en un sombreador no pueden ser recursivas porque todas las funciones GLSL son como funciones en línea en C ++ debido a problemas de compatibilidad con hardware de GPU más antiguo.

¿Es posible simular o falsificar la recursión en el código del sombreador, o incluso puedo lograr la reflexión y la refracción simultáneamente sin usar la recursividad? No puedo ver cómo puede suceder sin recurrencia, pero podría estar equivocado.

Respuestas a la pregunta(1)

Su respuesta a la pregunta