中国科技论文在线
面向对象的实现方案。
45 了GPGPU的应用。本文对光线跟踪渲染器在CUDA上的实现进行了探索,并给出了一种1 整体设计
在使用GPU进行加速的软件设计中,主要有两种方式。一种方式是将程序的控制逻辑主要由CPU来完成,而只在需要进行数据运算的时候,将需要的数据传入GPU进行计算[5]。而另一种方式则是完全在GPU上进行程序的运行[6] 。这两种方法各有优劣:前一种方式在进行计算前后需要来回传输必要的数据,当数据量较大时,GPU与内存间的传输带宽将成50 为软件性能的主要瓶颈;而在后一种方式中,由于GPU并不适合做逻辑控制,过于复杂的
程序逻辑将使得GPU的并行计算难以发挥。考虑到在光线跟踪渲染器中,场景数据往往较大,并且个人电脑上的光线跟踪应用会更多地关注实时性能,短时间内需要进行多次渲染,若采用第一种方式数据传输量会非常大,因此本文采用了第二种方式来进行设计。
利用面向对象的设计思想,可以很容易设计出光线跟踪渲染器的结构。本文所设计的光55 线跟踪渲染器的主要类图如图1所示。
图1 整体设计类图
在整体设计时,本文考虑了整个渲染器的可扩展性。通过对抽象类Renderer的不同实60 现,外部使用者可以不进行任何修改,仍然通过Renderer类来调用新的渲染方式。而通过
继承Primitive类,并实现其求交点的方法,可以很方便地为该渲染器增加新的图元类型。 2 GPU上的对象数据存放
一般来说,渲染器中的场景数据往往是从外部文件读入到内存中的。为了在GPU上进行光线的跟踪,这些数据需要从内存复制到CUDA的全局内存(Global Memory)中。CUDA65 提供了实现内存复制功能的函数,其函数形式类似于C语言中的malloc和memcpy。然而
在数据复制过程当中,并不能仅仅申请一块与内存中场景数据对象同样大小的全局内存空间,然后执行简单的内存块复制操作。这是因为在面向对象的程序设计中,对象指针的使用是难以避免的。Renderer对象包含指向Scene对象的指针变量。在这种情况下,只将Renderer对象复制到GPU内存中将无法通过该指针变量访问到Scene对象。仅仅将Scene对象也复70 制到GPU内存并不能解决问题,因为Scene对象在GPU内存中的地址将不同于其在内存中
搜索“diyifanwen.net”或“第一范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,第一范文网,提供最新人文社科CUDA光线跟踪渲染器的实现和优化(2)全文阅读和word下载服务。
相关推荐: