光线追踪

图形学基础——光线追踪

光线追踪(Ray tracing)是三维计算机图形学中的特殊渲染算法,跟踪从眼睛发出的光线而不是光源发出的光线,通过这样一项技术生成编排好的场景的数学模型显现出来。这样得到的结果类似于光线投射与扫描线渲染方法的结果,但是这种方法有更好的光学效果,例如对于反射与折射有更准确的模拟效果,并且效率非常高,所以当追求高质量的效果时经常使用这种方法。

光线追踪分为两种:

• 对象顺序渲染(object-order rendering):依次渲染每一个对象,然后更新每一个新对象对其它对象的影响。
• 图片顺序渲染(imageorder rendering):依次渲染像素,渲染每一个像素是考虑到每一个对象对它的影响。

光线追踪器一般来说可以很好地解决对象顺序框架难以解决的阴影和反射问题。

图形学基础——光线追踪

光线追踪的基本算法

光线投射 ,光线追踪与路径追踪的区别

光线投射 Ray Casting [1968]

光线投射(Ray Casting),作为光线追踪算法中的第一步,其理念起源于1968年,由Arthur Appel在一篇名为《 Some techniques for shading machine rendering of solids》的文章中提出。其具体思路是从每一个像素射出一条射线,然后找到最接近的物体挡住射线的路径,而视平面上每个像素的颜色取决于从可见光表面产生的亮度。

光线投射 ,光线追踪与路径追踪的区别
光线投射:每像素从眼睛投射射线到场景

光线追踪 Ray Tracing [1979]

举例几个光线追踪的问题和解决方案

问题:

1、性能

算法的递归性质和大数目的追踪光线,渲染过程可能持续数小时。80-90%的渲染时间花费在计算光线和物体交点上。

2、走样

3、尖锐的阴影

基本的光线追踪算法只能得到尖锐的阴影(因为模拟的是点光源)。

4、局部光照和着色

算法只追踪少数目的光线,只有四种类型的光线被考虑在内,物体之间的漫反射光没有被考虑在内,即算法并不包括全局光照。

解决方案:

1、性能

a、使用更多或者更好的硬件

b、大规模并行计算

每一个光线都相互独立。

将图像分割,分配在多核上或者分布式网络上;或者分配在多个线程上。

c、限制交点检测的数目

光线追踪算法—图像纹理

1. 纹理的概念

由于一个物体表面的不同位置上通常有含有不同的颜色或者其他属性(如发射率、法线等),所以需要一种方法来表示物体每个位置上的不同的属性。在CG中,通常通过使用纹理映射技术来表示物体不同位置上不同的属性。
由于物体可以是一维、二维或者三维的,所有纹理技术可以适用于1D、2D与3D空间。通常来说,纹理映射技术可以通过两种方法来实现,一种是将物体的属性存储在一个二维数组中,该数组一般称为纹理图,然后使用物体的某个位置信息或者其他信息在纹理图中查找属性值,或者也可以使用一个程序来计算物体每个位置上的属性,该实现方法通常称为过程纹理。

2. 纹理分类

纹理可以根据多种方法来进行分类:

• 根据纹理函数的维度:1D纹理,2D纹理,3D纹理
• 根据纹理的实现方法:过程纹理或者使用存储然后查找实现
• 根据纹理改变物体的属性:凹凸贴图、漫反射贴图、光泽贴图、环境贴图、置换贴图、深度纹理

3. 纹理映射方法

光线追踪算法——过程纹理

1. 过程纹理的概念

过程纹理通过编写代码来生成相应的颜色值,而不是从图像中获取颜色值。相比较从图像中获取颜色而言,过程纹理的优点是可以对空间中的任意一点定义纹理,并且不需要额外的存储空间来存储图像。通常某些具有数学表达式的图像可以很好地通过过程纹理来实现。过程纹理计算空间中某个点的纹理时可能需要花费更多的时间,从图像获取只需要直接获取即可。

2. 3D棋盘过程纹理

3D棋盘过程纹理可以通过数学表达式来表示,具体代码如下:

Color Checker(const Point3f& point)
{
  const Float size = 100.0f;
  const Float BIAS = -0.000187453738;
  const Float x = point.x_ + BIAS, y = point.y_ + BIAS, z = point.z_ + BIAS;

  if ((static_cast<int>(floor(x / size)) +

光线追踪算法—镜面反射

1.镜面-镜面光线传输计算

只涉及主光线计算而渲染出来的图像无法真实表现现实中的光线照射,通过增加能够反射光线的材质,进行空间中具有反射材质的对象之间的反射光线的追踪,可以更好地体现真实感。

2.光线镜面反射的计算

当光线与包含反射材质的物体进行碰撞后,计算反射方向,追踪计算得到的反射光线即可,因为光线可能在空间中无限的反射下去,为了避免这种情况,一般定义一个最大的追踪深度。根据反射光线与空间的交互可能存在的四种情况,分别返回相应的结果:

1. 反射光线没有碰撞到任何物体,直接返回背景颜色
2. 反射光线碰撞到漫反射材质对象,则返回漫反射材质对象上该点处的颜色
3. 反射光线碰撞到镜面反射材质对象,则继续追踪碰撞点产生的光线,将追踪的结果返回
4. 光线与光源碰撞,直接返回光源的颜色

3.一个典型的渲染结果

在场景中,一个水平面上放置两个球体,红色球体拥有镜面反射材质,另一个则为漫反射材质,渲染结果如图所示:

光线追踪算法—阴影绘制

1.阴影的作用

阴影效果在真实感图像生成中提供给图像更多的真实感,并且能够为场景提供某些定性分析,如光照的位置、光照的范围等信息。

阴影可以看为光源看不到的地方,即从光源往各个方向发送光线,则光线无法照射到的区域则为阴影。
在光线追踪中,从观察光线与物体的碰撞点向光源引一条光线,光线方向指向光源,若该光线在到达光源之前碰撞到某些物体,则该点位于阴影中。

2.阴影的生成实现

阴影的生成如同上述所讲一样,只需在碰撞点往光源方向引一条光线,然后判断光线是否与物体相交,然后根据相交与否产生相应的颜色。

具体的代码如下(c++实现):

Color Phong::Shade(const ShadeRecord& shade_rec) const
{
  Vector3f out_dir = -shade_rec.ray_.dir_;
  const std::vector<LightPtr>& lights = shade_rec.world_.lights_;

【视频】PowerVR 光线追踪提供实时,逼真的渲染

为全方位发展,Imagination开发了与光线追踪相关的IP,而光线追踪技术一直被认为是计算机图形学中的“圣杯”,其使得超写实光照的开发更加简单明了。

PowerVR 光线追踪提供实时,逼真的渲染

前往Imagination官方优酷观看: http://v.youku.com/v_show/id_XMjgxMTc1MTY4OA==.html

详解PowerVR Wizard架构的光线追踪

作者:Simon Walton

Imagination素以移动设备的芯片IP闻名,如智能手机和平板电脑,并在性能、功率及占用面积方面享有盛誉,且一直保有市场领先地位。为全方位发展,Imagination开发了与光线追踪相关的IP,而光线追踪技术一直被认为是计算机图形学中的“圣杯”,其使得超写实光照的开发更加简单明了。Imagination的PowerVR Wizard GR6500架构是图形处理单元(GPU)的设计,集成了有效功能,使SoC制造商在移动设备内提供光线追踪硬件成为现实。以下是Imagination早前在旧金山2017游戏开发者大会上展示的视频。

使用光线追踪,Unreal引擎创建360°全景图将更加简单

自2015年YouTube引入视频功能以来,360°VR全景视频已成为主打趋势。即使没有VR头盔,它们也能展示独特的如身临其境般的体验。这里,我指的是,具有360°视频功能的摄像机所拍摄的真人电影。实际上,这里的全景是两张360×180的等量矩形2D图片投射到一个概念性的3D球体上。

它们经常被贴上3 D或VR的标签,但这是不准确的。虚拟现实(VR)目前被描述为一个计算机生成的世界,具有某种程度的交互性。不过,对于真人全景图,你只是一个被动的观众,而不是交互式的参与者。由于VR头盔是观看这些360°视频的最佳方式,所以这一点更容易含糊。

有些人也将360°视频看作3D,因为观看者可以通过旋转球体或移动电影设备全方位观看。不能将它们与影院放映或3D电视放映的3D内容混淆,那些内容是戴着特殊的眼镜观看的。平面全景不能提供深度信息。而立体全景确实展示了深度感,但必须使用VR头盔才能观看。

不过,在这两种全景都增加了娱乐价值,旨在给每位观众独特的体验。从计算机生成的动画电影,到待创建结构的架构效果图,其应用的范围十分广泛。

同步内容
--电子创新网--
粤ICP备12070055号