Нужно избавиться от рекурсии в данной функции с помощью стека\очереди. Запутался где именно и какие параметры нужно добавлять в очередь.
Vector3 GetIntersectionPointColor(Ray ray, IHitable world, int depth)
{
if (world.Hit(ray, 0.001f, float.MaxValue, out var hitRecord))
{
if (depth < 50 && hitRecord.Material.Scatter(ray, hitRecord, out var attenuation, out var scattered))
{
return attenuation * GetIntersectionPointColor(scattered, world, ++depth);
}
return Vector3.Zero;
}
var unitDirection = Vector3.Normalize(ray.Direction);
var amount = (float)(0.5f * (unitDirection.Y + 1.0));
var white = new Vector3(1, 1, 1);
var blue = new Vector3(0.5f, 0.7f, 1);
return Vector3.Lerp(blue, white, amount);
}
Вариант простым циклом, без стеков и очередей. while(true) можно заменить на проверку depth, чтобы в бесконечный цикл не уйти.
Vector3 GetIntersectionPointColor(Ray ray, IHitable world, int depth)
{
var scattered = ray;
Vector3 result = Vector3.One;
while(true)
{
if (!world.Hit(scattered, 0.001f, float.MaxValue, out var hitRecord))
{
var unitDirection = Vector3.Normalize(scattered.Direction);
var amount = (float)(0.5f * (unitDirection.Y + 1.0));
var white = new Vector3(1, 1, 1);
var blue = new Vector3(0.5f, 0.7f, 1);
return result * Vector3.Lerp(blue, white, amount);
}
if (depth >= 50 || !hitRecord.Material.Scatter(scattered, hitRecord, out var attenuation, out scattered))
{
return Vector3.Zero;
}
result *= attenuation;
depth++;
}
}
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости