Я пишу трассировщик путей на С++, и я бы хотел попробовать реализовать наиболее ресурсоемкий код в CUDA или OpenCL (я не уверен, какой из них выбрать).
Я слышал, что моя версия видеокарты CUDA не поддерживает рекурсию, и это то, что использует мой трассировщик пути.
Как я его кодировал как в Python, так и в С++, я опубликую некоторый упрощенный код Python для чтения:
def Trace(ray):
hit = what_object_is_hit(ray)
if not hit:
return Color(0, 0, 0)
newRay = hit.bouceChildRayOffSurface(ray)
return hit.diffuse * (Trace(newRay) + hit.emittance)
Я попытался вручную развернуть эту функцию, и существует определенный шаблон (d
is diffuse
и e
is emittance
):
Level 1: d1 * e1
Level 2: d1 * d2 * e2
+ e1
Level 3: d1 * d2 * d3 * e3
+ d1 * d2 * e2
+ e1
Level 4: d1 * d2 * d3 * d4 * e4
+ d1 * d2 * d3 * e3
+ d1 * d2 * e2
+ e1
Возможно, я ошибаюсь...
Мой вопрос: как я мог бы реализовать этот код в цикле while
?
Я думал использовать что-то в этом формате:
total = Color(0, 0, 0)
n = 1
while n < 10: # Maximum recursion depth
result = magical_function()
if not result: break
total += result
n += 1
Я никогда не занимался задачей распутывания рекурсивной функции раньше, поэтому любая помощь была бы весьма признательна. Спасибо!