C++ 中的光线追踪颜色计算错误

问题描述 投票:0回答:1

我正在实现光线追踪框架,但遇到一些错误

图像应该看起来像这样,但在我的例子中看起来像:

如您所见,球体有一些黑点,并且不光滑。知道这个错误可能来自哪里吗?

c++ raytracing
1个回答
1
投票

这被称为 “癌症”,这是由于从表面发射阴影光线,但光线再次与该表面相交而引起的伪影。结果是物体的某些东西挡住了光线,而不知道物体本身在阴影的来源处做到了这一点。这是浮点精度误差的自然结果。

解决该问题的最简单方法之一是引入“epsilon”值,并且不计算低于该阈值的交集。这允许更复杂的几何体自相交,但有点脏。

更一般地,您可能决定将反射光线的对象排除在光命中测试中。在更广义的 3D 场景中,一切都是三角形,您可以排除该三角形。但在大量镶嵌的场景中,当您碰到相邻的三角形时,您可能会再次遇到该问题。

另一种方法是,如果表面法线指向与阴影光线相同的方向,则忽略相交。如下所示,仅当两者的点积不为负时才计算交集。

实际上,结合使用上述措施通常可以解决此问题,但您也可以只选择其中一项。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.