Z punktu, w którym znajduje się obserwator, wypuszczane są promienie. Jeśli promień trafi w jakiś obiekt, z punktu przecięcia (rekursywnie) wypuszczane są kolejne promienie (co najmniej jeden), przy czym kierunek nowych promieni jest losowy; od jakości funkcji losującej zależy jakość obrazu, a każdy obiekt może pochłaniać lub emitować światło. Tworzenie pojedynczej ścieżki kończy się, gdy głębokość rekursji przekroczy pewien limit. Wówczas wyznacza się ostateczne natężenie światła, jakie dociera do obserwatora: składa się na nie natężenie światła pochodzące od obiektów emitujących, które następnie na ścieżce jest tłumione; tłumienie zależy od współczynnika pochłaniania światła dla każdego trafionego obiektu (funkcja BRDF) uwzględniające m.in. kąt pomiędzy promieniem padającym i odbitym.

Pseudokod dla path tracingu, w którym generowany jest tylko jeden promień na każdym etapie:

funkcja path_trace(promień) begin if głębokość rekurencji > limit then return natężenie domyślne;

if promień przecina pewien obiekt then begin promień odbity = losowy promień z punktu przecięcia; natężenie = path_trace(promień odbity);

return natężenie emitowane przez obiekt + (natężenie * BRDF); end; else return natężenie domyślne; end.