Spellwrath实时光线追踪软阴影(一)

直延续至计算机图像上。他希望有一天能完全实时模拟光的所有方面。从事电脑游戏便是兴趣使然。在Spellwrath游戏中,他创建了一个实时的光线追踪引擎。目前,Michael是德国武装部队的一名军官。

现代实时图像非常依赖光栅化技术来实现高帧速率和可信的场景。这个过程通常非常简单:取一个多边形,稍作移动,再绘入缓冲区并添加华丽的阴影。

光栅化有其优势和劣势。毫无疑问,其操作很快,但考虑多个多边形的相互影响时其劣势又展现了出来。这是何意?我们这样来说:绘制第二个多边形时,便失去了任何形式的位置概念。按这种方式绘制多边形必须不断追踪绘制顺序。当然,我们有解决方案,如深度缓冲,但对于透明的多边形这些却于事无补。至于阴影会如何呢?情况甚至更糟。这里我想要从不同的视角进行讨论。

光线追踪

在离线逼真3 D渲染中,有一种方法始终占据领先优势。你可能从标题中看出了端倪,即光线追踪。这个概念也很简单。我们从屏幕的每个像素(观察者的眼睛位置)投射光线至场景中,不管触及何物都是我们要渲染的对象。可以从交叉点/触及点投射更多的光线至我们感兴趣的对象。投向光源,我们可以看到是否对象位于阴影中或已点亮。使用入射角投射,我们可以得到反射。每条光线会产生不同的像素阴影效果。

光线追踪扭转了事物的本质。其并非跟踪每个光子从光源出发走向何处,而是反向跟踪其来自何处。当然,除非你在光子映射中进行了添加,这得另当别论。

所以,在渲染实时场景时为何不能使用光线追踪?答案是:速度。要找到光线的交叉点和充满多边形的场景是非常慢的。且每个像素都要重复这样的操作。如果希望得到阴影、反射和折射则更加如此。且其结果甚至比不上使用阴影映射对场景进行光栅化的效果及其他效果,而且每帧还牺牲了大量的毫秒。为提高质量及超越光栅化,我们需要更多的射线,并进一步降低每秒帧率。除非我们仿效光栅化示例创造自己的锦囊妙计。

实时光线追踪的一些技巧

当然,光线追踪并非总是比光栅化的效率低,也有例外情况。当3D数据组织得十分有条理时,光线追踪会变得更容易更快速。如果只需要测试表示几何图形的子集而不是整个场景中的几何图形,那么,找到射线和几何图形之间的交叉点更容易。最好的例子可能是立体像素场景,特别是那些被组织成八叉树的图形(或更稀疏的立体像素八叉树)。结果证明,该数据的光线追踪速度更快,且相比光栅化方法其内存效率更高。

某些时候,我会选择使用立体像素的实时光线追踪路线。但我不是一个纯粹主义者,且我倾向于混合一些技术,所以有时会借用延迟渲染方法。尽管这样“作弊”,但我始终在考虑的是:怎样才能获得美观的阴影?

通常,在光线追踪时使用单一的反弹渲染阴影会产生硬边,即所说的硬阴影(见左上图)。

这种类型的阴影很适合非常微小的点光源,但是微小的点光源却极少发生。通常,光源至少有一些宽度,从而可以创建部分阴影/半影——或就渲染来说,软阴影(见右上图)。

为了在光线追踪时创建软阴影,特别是动态软阴影,通常需要在整个光源区域投射多条光线。很显然,这不是实时渲染所需要的。我们的目标始终是减少二次光线的投射。

所幸,Alexandru Voica所写的通过将光线追踪技术混合至栅格化管线中来创建软阴影的文章给了我很好的启示。我也尝试混合光线追踪和栅格化技巧,我确信这对我很有帮助。

快速软阴影

首先,我们必须认识到,我们正努力实现的并非精确的物理软阴影。相反,我们正在试图创造逼真的软阴影,其在游戏或其他实时应用程序中必须达到极佳的效果。因此,没有必要投射100秒光线来确定区域光可以达到的某个像素。相反,我们将尝试投射单个光线来实现实时所需的速度。

注意,我对Imagination的算法稍作了修改,以适合我的实时光线追踪器。为进行设置,将需要一个新的场景缓冲区来存储所有从光源光线追踪处获得的阴影信息。我们称之为光线追踪阴影缓冲区。

未完待续

声明:
本文为原创文章,转载需注明作者、出处及原文链接,否则,本网站将保留追究其法律责任的权利

--电子创新网--
粤ICP备12070055号