计算机论文
基于CPU的光跟踪算法
时间:2022-03-05 21:31 所属分类:计算机论文 点击次数:
1.引言
近年来,CPU在计算能力和可编程性方面都有了很大的提高,GPU在需要大量计算的密集计算领域发挥了重要作用。基于CPU的各种密集计算被移植到GPU上,以利用GPU的巨大计算能力加速整个计算过程。光跟踪算法是生成真实图形的一种非常重要的方法。广泛应用于电影、游戏、广告等行业,光跟踪算法也是典型的密集计算算法。使用基于CPU的原始光跟踪渲染图片是非常耗时的操作。因此,如果CPU上的光跟踪算法能够映射到CPU上,加快光跟踪算法的实施时间,将带来巨大的经济效益。因此,基于CPU的光跟踪算法已成为国内外研究人员的研究热点。
2.基于GPU的光线跟踪。
2.1相关工作。
目前,使用CPU加速光跟踪算法主要有两种方法。第一种是Carr和其他人提出将CPU转换为一个蛮力的计算器来执行光的一个三角形,并在CPU上完成任何光的生成和着色过程。这就要求CPU仍然执行大部分渲染工作。Carr等人指出,在ATIradeon8500上,每秒最快可执行1.2亿次光的一个三角形。同时,作者还指出,由于GPU单精度浮点的限制,图片中仍存在一些不真实的地方。
第二种方法是由Purcell和其他人提出的。改变方法将整个光跟踪器移植到CPU进行实现。GPU执行从产生光线、加速结构遍历到最终着色过程。从那时起,许多相同的项目都是基于Purcell模型的。
2.2GPU上光跟踪算法的映射模式。
将传统CPU上执行的光跟踪算法映射成GPU协助或基于GPU的光跟踪器有很多方法。以下是本文实现中提出的基于CPU的Whited模型的Purcell的映射模型和光跟踪器。光跟踪器的布局如图2.1所示:
在Purcell的论文中,它将光的一三角形求交,以及遍历过程分为两个独立的遍历核和求交核。在本文的实现中,光跟踪算法也根据上述模型图分解为三个步骤:光生成、光一三角求交和着色。
在跟踪光线之前,需要生成从视点指向屏幕的原始光线(primaryray)。在GPU上,光栅的插值能力可以在单核调用中产生所有原始光。
给定观察矩形的四个角度和视点(用于生成图片的投影平面的一部分)首先计算视锥的四个边缘。如果光栅在这四种光之间按照512×512的规格插入,最终可以产生512×512图片(像素和采样点)的所有原始光的方向。同时,这些方向可以存储在一种纹理中,并将其作为内核的输入。所有的原始光都有相同的起点,但仍然存储在同一方向的纹理中,具有相同的维度。因为当产生阴影光或反射光时,光的原点就会发生变化。
求交核心将光的原点、方向和场景描述作为输入数据。核心被调用几次后,我们将每个像素输出一个击中记录。如果一条光击中场景中的三角形,返回击中点的三个重心坐标和相关击中的三角形。此外,还将输出发现的交叉点沿光线的距离和击中三角形的材料。这需要五个浮点值来形成一个击中记录。纹理只能支持四个颜色通道(RCBA),因此如果击中记录可以减少到四个值,它将是非常有益的。
观察发现,只需要三个重心坐标的两个,因为在三角形内部,它们总是加1个。这使得将交点记录存储在单独的RGBA纹理中是可行的,其维度与其他两个光纹理相同。
Moller和Trumbore提出了一种高效的光一三角求交算法,利用CPU在向量计算中的优势进行求交计算。以下是求交代码,也显示了如何利用向量指令提高效率。
当所有原始光都计算出交叉状态时,您可以查询着色过程所需的表面法线和材料信息。每个击中记录都存储一个指向材料纹理的索引,包括三角形法线、材料颜色和类型。根据击中记录的中心坐标插入三个顶点的法线。最终颜色可以根据(N-L)C计算,这里是法线,L是光源的方向,G是三角形的颜色。
目前,根据击中三角形的材料类型(漫反射材料或镜面反射材料),需要产生二次光来计算阴影和反射。
1)如果光线射出场景,像素将被赋予整体背景色。
2)如果一条光击中一个漫反射材料表面,就会发射阴影射线(shdowray)。这些光的起点是击中点,方向是从击中点指向光源。
3)如果一条光击中了镜面反射材料的表面。发射镜面反射光。镜面发射光的起点也在击中点,但其方向是关于入射光和插值后的法线对称方向。一个真正的Whited类型的光跟踪器也支持透明材料,从而产生折射光。但由于主要研究加速结构,本文没有考虑折射光。
4)如果阴影光击中一个几何体,则表明在光源和击中点之间存在一个几何体,因此该像素应为黑色(在阴影中)。当跟踪阴影光时,不要关心最近的击中点,而是更关心是否有这样的击中点。因此,当发现交叉点时,可以停止整个交叉过程,从而加速算法的处理过程。在本文的实现中,以同样的方式跟踪阴影光和反射光,因此没有使用此优化策略。
每个像素已经产生了正确的二次光。如有必要,可执行另一个历程/交付过程,跟踪上述二次光。每次调用着色程序,每个像素都可以返回一个颜色值和一个新的光。着色核心还可以将上一个着色程序的输出作为着色程序的输入。这使得这些连续镜面反射的颜色可以在跟踪连续光时合并。
与Carr等人的程序不同,本文采用的程序没有浮点精度过低的问题,因为Ceforce7300支持整个管道中真正的32个浮点操作。