这个在GPU上运行的光线追踪函数,是否安全?

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

enter image description here

这是函数:
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 有关。但我已经测试了所有其他函数,它们都按预期工作。
以下是可视化的 `Normal + RandomVec` 或 `S`:

enter image description here

当在CPU上执行时,结果完全相同。

这是在CPU上可视化的hit_times

enter image description here

但在GPU上,所有三个球都是白色的。 以下是完整的片段着色器代码:https://pastebin.com/3xeA6LtT 以下是在CPU上运行的代码:https://pastebin.com/eyLnHYzr


1
要实现光线追踪,您需要计算着色器。 - Victor Gubin
2
我已经看到多个运行在片段着色器上的程序。 - Samuel
@VictorGubin https://www.shadertoy.com/view/4tl3z4 - Samuel
1
你尝试简化你的着色器了吗?看看会有什么变化? - Yakov Galka
@YakovGalka,您建议我尝试什么? - Samuel
3
你确定这不是转换问题吗?比如将颜色从无符号整数范围[0..255]存储到期望值在[0..1]范围内的浮点数中?尝试除以255.0来确认是否是这种情况。 - StarShine
1个回答

4
所有的球形都是白色,很可能是因为 GetRayColor 函数中的 ClosestSphere.Hit 总是为真。
我认为问题在于你的 IntersectSceneSpheres 函数。
在 CPU 代码中,你返回默认为假的 HitAnything。同时,在片元着色器中,你返回结构体 ClosestRecord,如果没有命中,它仍然未初始化。
IntersectSceneSpheres 函数的末尾明确添加 ClosestRecord.Hit = HitAnything; 应该可以解决这个问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接