这种在 GPU 上运行的光线追踪功能,GPU 安全吗?

Is this ray tracing function that runs on the GPU, GPU safe?

我尝试在片段着色器中编写一个简单的光线追踪器。 我有这个函数应该创建一个漫射球体,如下所示:

函数如下:

vec3 GetRayColor(Ray ray)
{
Ray new_ray = ray;
vec3 FinalColor = vec3(1.0f);

bool IntersectionFound = false;
int hit_times = 0;

for (int i = 0; i < RAY_BOUNCE_LIMIT; i++)
{
    RayHitRecord ClosestSphere = IntersectSceneSpheres(new_ray, 0.001f, MAX_RAY_HIT_DISTANCE);

    if (ClosestSphere.Hit == true)
    {
        // Get the final ray direction

        vec3 R;
        R.x = nextFloat(RNG_SEED, -1.0f, 1.0f); 
        R.y = nextFloat(RNG_SEED, -1.0f, 1.0f);
        R.z = nextFloat(RNG_SEED, -1.0f, 1.0f);

        vec3 S = normalize(ClosestSphere.Normal) + normalize(R);
        S = normalize(S);

        new_ray.Origin = ClosestSphere.Point;
        new_ray.Direction = S;

        hit_times += 1;
        IntersectionFound = true;
    }

    else
    {
        FinalColor = GetGradientColorAtRay(new_ray);
        break;
    }
}

if (IntersectionFound)
{
    FinalColor /= 2.0f; // Lambertian diffuse only absorbs half the light
    FinalColor = FinalColor / float(hit_times);
}

return FinalColor;
}

出于某种原因,hit_times 似乎是常数。 此完全相同的代码适用于 CPU 并生成了随附的屏幕截图。

我不确定这是否与 GPU 有关。但我已经测试了所有其他功能,它们按预期工作。

  1. 法线很好且完全相同
  2. 随机数生成器工作正常,已经可视化

这里是Normal + RandomVecS的可视化:

CPU.

上完成时完全相同

这是 CPU

上可视化的 hit_times

但在 GPU 上,所有三个球体都是白色的。 这是完整的片段着色器:https://pastebin.com/3xeA6LtT 这是适用于 CPU 的代码:https://pastebin.com/eyLnHYzr

所有球体都是白色的很可能是因为 GetRayColor 函数中的 ClosestSphere.Hit 始终为真。

我认为问题出在您的 IntersectSceneSpheres 函数中。

在 CPU 代码中 return HitAnything 默认为 false。同时在片段着色器中,你 return 结构 ClosestRecord 如果没有被击中,它仍然未初始化。

IntersectSceneSpheres 函数的末尾显式添加 ClosestRecord.Hit = HitAnything; 应该可以修复它