我尝试在片段着色器中编写一个简单的光线追踪器。
我有一个函数,旨在创建一个漫反射的球体,如下所示:
这是函数:
由于某种原因,似乎 `hit_times` 是恒定的。这段代码在 CPU 上运行正常,附带了截图。
我不确定这是否与 GPU 有关。但我已经测试了所有其他函数,它们都按预期工作。
以下是可视化的 `Normal + RandomVec` 或 `S`:
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`:
当在CPU上执行时,结果完全相同。
这是在CPU上可视化的hit_times
。
但在GPU上,所有三个球都是白色的。 以下是完整的片段着色器代码:https://pastebin.com/3xeA6LtT 以下是在CPU上运行的代码:https://pastebin.com/eyLnHYzr