具有反射的光线追踪伪影

Ray tracer artifacts with reflection

所以我正在尝试构建一个追踪器。我遵循了本教程:https://www.youtube.com/watch?v=SMOJGxyd9BE&list=PLHm_I0tE5kKPPWXkTTtOn8fkcwEGZNETh&index=9

所以一切都很好,除了我 运行 遇到一个问题。我试图让球体下的平面反射,但当我这样做时,我得到了这个 st运行ge 效果

如果你注意到地面上的反射有这些黑点。我一直在试图弄清楚发生了什么,但它 st运行ge 因为整个平面具有相同的法线,所以反射应该是正确的。有没有人有过这方面的经验?我检查了一下,它与阴影无关。

常见问题

这看起来像“表面粉刺”,当由于精度有限,阴影测试射线的原点(几乎)位于您相交的表面的错误一侧时,就会发生这种情况。因此表面阴影本身。

例如,您计算相机光线在 (x, y, z) 处撞击球体的交点。由于双精度值的精度有限,因此 (x, y, z) 可能不 恰好 在球体表面上。接下来,您创建一条从 (x, y, z) 朝向光源的光线,以查看它是否在阴影中。如果 (x, y, z) 由于精度有限,实际上就在球体内部,那么阴影测试将失败,因为球体会遮挡内部的所有点。

这通常是通过将 (x, y, z) 沿交点处的表面法线方向稍微向后移动来解决的。您使用微移点作为阴影射线的原点,因为您知道它位于球体的正确一侧。

调试提示

在您的情况下,球体本身不会出现粉刺,但它的反射会出现。这表明微调有时小于从初始光线到反射光线到球体的累积精度损失。也许你的微调太小了。也许你计算反射光线的地方出了问题。

也可能是与平面的交点有时在错误的一侧,所以你的反射光线在地板下方而不是后退。

为了进行调试,我将“我什么也没命中”颜色改成粉红色,将“我在阴影中”颜色改成石灰绿。如果您在这些点上看到粉红色,那么计算反射光线时出现了错误。如果您看到柠檬绿,那么它就是表面粉刺,您需要确保没有系统性精度损失并且您的微调系数足够。

高级微调

我最近读到 pbrt handles the precision problem more carefully than the simple nudging I described. It's explained in great detail,但基本思想分为两部分。

首先,计算出的交点(对于大多数形状)重新投影到表面,以更精确地估计实际命中点。

其次,它在整个计算过程中传播误差估计。当它需要反射或阴影射线的原点时,它会将交点(改进的估计)微调到刚好足以确保它在由交点及其不确定性确定的框之外。这保证了它位于表面的正确一侧,同时需要更小的推动。