这种在 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 有关。但我已经测试了所有其他功能,它们按预期工作。
- 法线很好且完全相同
- 随机数生成器工作正常,已经可视化
这里是Normal + RandomVec
或S
的可视化:
在 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;
应该可以修复它
我尝试在片段着色器中编写一个简单的光线追踪器。 我有这个函数应该创建一个漫射球体,如下所示:
函数如下:
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
所有球体都是白色的很可能是因为 GetRayColor
函数中的 ClosestSphere.Hit
始终为真。
我认为问题出在您的 IntersectSceneSpheres
函数中。
在 CPU 代码中 return HitAnything
默认为 false。同时在片段着色器中,你 return 结构 ClosestRecord
如果没有被击中,它仍然未初始化。
在 IntersectSceneSpheres
函数的末尾显式添加 ClosestRecord.Hit = HitAnything;
应该可以修复它