光线追踪:带有区域光的水平伪影

Posted

技术标签:

【中文标题】光线追踪:带有区域光的水平伪影【英文标题】:ray tracing: horizontal artifacts with Area lights 【发布时间】:2013-11-14 14:50:31 【问题描述】:

嗨,这些水平线的原因是什么?区域光是绿色平面上方的黄色方块。线的图案会随着平面上方区域光的距离而变化,但它们仍然是水平线。

我有 4 个点光源均匀分布在区域光的表面(黄色方形贴片)。

您可以看到它的样子 here(16 倍超级采样)。

【问题讨论】:

看起来像阴影粉刺(A.K.A. 不正确的自我阴影)。您是否正在采取措施避免阴影光线与起源它们的表面相交?您可以使用表面法线偏移阴影光线的原点,或检查相交的形状是否不同于发出光线的形状。 【参考方案1】:

这看起来像阴影痤疮:由于近似误差而产生的不希望的自阴影,图案化。请注意,完全阴影区域没有线条,这表明问题在于阴影系统错误地“认为”绿色平面在那里处于阴影中。

编辑:由于您是光线追踪,问题可能是您错误地与“发射”它们的平面的出射阴影光线相交。以下建议适用于使用阴影贴图的光栅化,而不是光线追踪,但它们可能仍然具有指导意义...


阴影映射的工作原理是首先从每个灯光的角度绘制深度图,记录阴影对象的“阴影图”。然后,在绘制实际图像时,每个像素从阴影贴图中采样阴影深度,并将其与从该像素位置的该光线计算的深度进行比较:如果像素深度大于阴影深度,则它被阴影。

请注意,如果要绘制的对象距离灯光最近的阴影对象,则像素深度应该与阴影深度相同。但是,由于采样和浮点计算并不精确,因此比较只是大约相等。所以,部分时间(基于采样和浮点误差的奇思妙想),它认为像素深度比同一个物体造成的阴影深度更远:物体本身会产生阴影。


有几种方法可以避免暗疮。最简单的选项(也是您场景的明显选择)是从阴影投射器列表中删除对象。由于您的飞机似乎打算用作“地板”,因此无论如何它不应该遮蔽任何东西。这样做的另一个好处是节省了将地板绘制到所有阴影贴图上的时间......

根据同样的原则,如果一个对象是“不漏水的”,单边三角形始终朝外,则应该反转阴影贴图的三角形方向测试。这将从对象的黑暗面获取阴影深度(无论如何它都处于全阴影中,因为它背对光线),所以它不会在明亮的一面造成粉刺。

如果您有一个必须从两侧可见的平面物体,您可以对阴影深度应用偏置;图形软件和硬件通常对此有规定。不幸的是,这可能有点繁琐:偏差必须足够大以隐藏采样/计算错误,但又必须足够小以至于不会导致其他伪影。

【讨论】:

以上是关于光线追踪:带有区域光的水平伪影的主要内容,如果未能解决你的问题,请参考以下文章

光线追踪、光线投射、光线行进和路径追踪有啥区别?

GAMES202 笔记-实时光线追踪

3D渲染-光线追踪-包围盒

为啥我的 CUDA 光线追踪器给我这个线程布局的错误代码 700?

减少光线追踪时的计算

实现光线追踪