简化问题
在三维游戏中,场景由各种物体组成,当这些物体组合在一起时,就会形成数百万个三角形。光线追踪最基本的功能就是发射出一条光线,然后沿着它在三维场景中的路径来定位它所到达的第一个物体,进而确定应该如何对该物体进行照明。然而,用场景中的每个物体去测试一条光线以确定它们是否相交,这样的做法效率太低、计算成本太高,完全无法实时进行。
因此,为了使用光线追踪技术,我们需要解决这一问题。
使用场景层次结构将兔子划分到多个小方框中
这可以通过建立光线追踪加速结构来实现。为了做到这一点,我们可以围绕整个游戏场景绘制一个方框,然后将其划分为多个较小的方框,再将这些小方框细分为更小的方框,我们按这种方式不断将方框进行细分,直到小方框中的三角形数量达到便于管理的程度为止。我们将其称为场景层次结构,它帮助我们将问题简化到一定程度,使现有的图形处理器可以有效地进行处理。
这种方法之所以有用,是因为当我们向游戏场景中发射光线时,可以根据场景层次结构逐层进行检查。首先,我们要检查光线到底有没有射入最大的方框(即我们的场景)。如果有,我们将继续检查下一层的小方框。在这个阶段,我们会发现光线射入了一些方框,但没有射入另一些方框。接下来,我们可以不断将光线未射入的方框排除在外,只重点关注光线射入的那些方框,直至我们找到光线与三角形相交的地方。至此,我们终于找到了自己的目标。
这种层次结构使我们能够找到光线和三角形最近的交点,而不必测试场景中的每个三角形。这极大地简化了问题,因此可以更快地完成处理过程。
在几何处理阶段(该阶段硬件会完成物体的动画处理工作)之后,我们会将那些三角形置入一个称为场景层次生成器的专用硬件中,该生成器可以生成上面所述的加速结构。我们还添加了一些专门的光线/方框/三角形测试器,它们是专用的固定功能硬件,用于通过加速结构进行光线追踪,并确定光线与三角形的交点。与使用软件可编程管线相比,在专用硬件中完成所有这些操作要快得多,而且更节省面积和功耗。
那么,当硬件确定光线照射到一个三角形之后,下一步该做什么?接下来我们会触发一个片段着色器,这是一个小程序,可以确定该三角形特定位置的颜色,这一步和传统的渲染方式基本相似。然后,通过该片段着色器程序,我们将更多的光线发射到三维场景中,随着此过程的不断重复,就可以建立起我们的光线追踪场景。
简化问题
在三维游戏中,场景由各种物体组成,当这些物体组合在一起时,就会形成数百万个三角形。光线追踪最基本的功能就是发射出一条光线,然后沿着它在三维场景中的路径来定位它所到达的第一个物体,进而确定应该如何对该物体进行照明。然而,用场景中的每个物体去测试一条光线以确定它们是否相交,这样的做法效率太低、计算成本太高,完全无法实时进行。
因此,为了使用光线追踪技术,我们需要解决这一问题。
使用场景层次结构将兔子划分到多个小方框中
这可以通过建立光线追踪加速结构来实现。为了做到这一点,我们可以围绕整个游戏场景绘制一个方框,然后将其划分为多个较小的方框,再将这些小方框细分为更小的方框,我们按这种方式不断将方框进行细分,直到小方框中的三角形数量达到便于管理的程度为止。我们将其称为场景层次结构,它帮助我们将问题简化到一定程度,使现有的图形处理器可以有效地进行处理。
这种方法之所以有用,是因为当我们向游戏场景中发射光线时,可以根据场景层次结构逐层进行检查。首先,我们要检查光线到底有没有射入最大的方框(即我们的场景)。如果有,我们将继续检查下一层的小方框。在这个阶段,我们会发现光线射入了一些方框,但没有射入另一些方框。接下来,我们可以不断将光线未射入的方框排除在外,只重点关注光线射入的那些方框,直至我们找到光线与三角形相交的地方。至此,我们终于找到了自己的目标。
这种层次结构使我们能够找到光线和三角形最近的交点,而不必测试场景中的每个三角形。这极大地简化了问题,因此可以更快地完成处理过程。
在几何处理阶段(该阶段硬件会完成物体的动画处理工作)之后,我们会将那些三角形置入一个称为场景层次生成器的专用硬件中,该生成器可以生成上面所述的加速结构。我们还添加了一些专门的光线/方框/三角形测试器,它们是专用的固定功能硬件,用于通过加速结构进行光线追踪,并确定光线与三角形的交点。与使用软件可编程管线相比,在专用硬件中完成所有这些操作要快得多,而且更节省面积和功耗。
那么,当硬件确定光线照射到一个三角形之后,下一步该做什么?接下来我们会触发一个片段着色器,这是一个小程序,可以确定该三角形特定位置的颜色,这一步和传统的渲染方式基本相似。然后,通过该片段着色器程序,我们将更多的光线发射到三维场景中,随着此过程的不断重复,就可以建立起我们的光线追踪场景。
举报