一种实时变焦光线追踪渲染引擎的制作方法

文档序号:13626173阅读:359来源:国知局
一种实时变焦光线追踪渲染引擎的制作方法

本发明属于计算机图形学中三维场景渲染算法实现,具体地是使用光线追踪渲染算法,建立可实时变焦的摄像机模型,将三维场景模型转换为可视的二维图片。



背景技术:

渲染是选取一个或多个视角,将描述三维场景的数据模型通过计算,输出二维数字图片的过程。渲染是计算机图形学中“可视化”的重要步骤。渲染是将输入的三维场景模型数据通过计算得到像素阵列的过程。渲染算法的核心,是厘清场景中的每一个物体对每一个像素的影响。从场景中的物体和画面上的像素的关系考虑,渲染技术可以被分成两类:对象导向渲染(object-orderrendering)和像素导向渲染(image-orderrendering)。对象导向渲染从三维场景中每个物体的角度出发,依次考察每个物体对所有像素的影响;像素导向渲染从二维画面中的每个像素的角度出发,依次考察每个像素,以及作用于被考察像素的所有物体。

通常,渲染算法必须在渲染速度和输出结果的保真度上做出一定的取舍,有的渲染方式提供很好的实时交互性能,即牺牲了保真度而保全了渲染速度;有的渲染方式则通过高出几个数量级的计算复杂度,即牺牲了速度而保全了保真度。正是为了应对各种软硬件系统中交互速度和保真度的折中和取舍,研究者发明了多种渲染算法。简单快速的算法常常忽略许多光学效应,比如仅考虑到本地着色和阴影。这类方法属于“本地照明算法”(localilluminationalgorithm),因为此类算法只考虑一部分光线,而忽略了大部分与反射或透射表面相关的光路。与之相反的,“全局照明算法”(globalilluminationalgorithm)则更为完整地模拟了场景中发生的光学现象,有时甚至包括交互漫反射和焦散等较复杂的光学现象。比如渲染一个阳光下的水池的场景时,考虑水池底部材料的漫反射现象。全局照明算法有两个计算特点:(1)难以预测数据访问的模式;(2)较高的算法复杂度。用全局照明算法渲染一幅高品质的图片常常需要花费上百小时,对一部数十帧每秒(fps)的电影做渲染,耗费的时间数以月计,常常渲染一部电影需要处理几百太拉字节(terabyte)的场景数据和临时数据。全局照明渲染算法数据访问模式的难以预测和三维场景数据和临时数据的规模之庞大,也意味着即便存在某种直接的并行方式,由于计算机系统的存储资源的限制,它能胜任渲染工作的可能性也很小。同时,通用微处理器的发展速度已经难以跟上三维模型场景复杂度的发展,图片大小和着色的复杂度也超出了通用微处理器的性能。因此,根据全局照明算法原理设计的硬件计算系统进入了研究者的视野。下面介绍一种并行化的光线追踪算法,也介绍光能传递和粒子追踪等其他可并行化的全局照明渲染算法。

光线追踪是一种将三维场景数据转换成二维图片的算法。这种算法意在通过使用计算机程序对真实世界中宏观光学现象的模拟,以达到高质量的渲染,即“物理真实”的图片。

光线追踪算法的原理是:追踪光线穿越三维场景的过程中,场景中物体对光线的作用。光线追踪算法包含以下模型:

(1)镜头模型:镜头负责产生从视点发出的射线,进入三维场景。(2)射线-物体相交:根据射线的几何参数和三维场景中图元的分布几何参数,确定从镜头发出的射线与三维场景中的哪些物体相交;

(3)光源模型:点光源、平面光源等光源模型;

(4)场景中物体表面散射函数:

(5)递推光线追踪:光线在光滑物体的表面改变方向后继续传播,需要确定次生光线的传播方向和光强;

(6)光线传播模型:当光线在透明的物体中传播时,光强会减弱,使用比尔定律等表述这一现象的数学模型建立光线传播模型。



技术实现要素:

本专利实现了在光线追踪渲染程序中的镜头焦距参数实时动态化。

如说明书附图1所示,建立一个虚拟摄像机模型,放置于三维场景中的某一点,即摄像机有方向和方位参数。摄像机包括视点o和矩形视平面abcd。摄像机定义了一套新的坐标系统,称为“摄像机坐标系”,摄像机坐标系的z轴如说明书附图1所示,是原点为视点o,方向指向视平面abcd的中心点。摄像机模型中有一个“世界坐标系---摄像机坐标系转换公式”,这一公式将定义三维场景的图元原本的坐标,即在“世界坐标系”中的坐标数据,转换为在摄像机坐标系中的坐标数据。

通常使用的虚拟摄像机模型是如附图2所示的“小孔摄像机模型”。在针孔摄像机模型中使用一个小孔取代镜头,场景中的光线经过小孔使底片曝光而成像。使用小孔摄像机模型产生的渲染图片处处锐利,不符合真实的摄影器材拍摄的结果,也不符合人的眼睛捕捉到画面的结果。

真实的摄像器材中使用弧面透镜作为取光器,产生失焦的摄影效果。如附图3所示,透镜位于底片与场景之间,场景中的点p2位于焦平面、p1不位于焦平面。位于焦平面的点p2发出的光线经过透镜投射在底片上一个清晰的点,而不位于焦平面的点p1发出的光线经过透镜在底片上呈现为一个不清晰的点。

本专利使用的程序模拟真实摄像头所拥有的透镜系统,让光通过一个限定大小的光圈聚焦在胶片平面上的。因为这个光圈的面积是非无穷小的,在场景中的任何一个点都可能被投射在胶片平面上被称作模糊圈的区域,如说明书附图3所示。相应地,场景中一个一定大小的区域可能通过一个点在图像平面中呈现一个模糊的图像。模糊圈的大小受到光圈的半径以及目标和透镜之间的距离影响。焦距是透镜到使物体投影到零半径模糊圈的物体平面之间的距离。这些点会很完美的合焦。实际上,目标并不需要完全在焦距平面上来达到锐聚焦;只要模糊圈比一个像素点要小,目标就会呈现合焦的状态。真实生活中的摄像头的光圈是非无穷小的,透镜控制会参考胶片平面来调整透镜的位置。因为光圈是非无穷小的,不是所有场景中的目标在胶片上都会完全合焦。如说明书附图3所示,p1点并没有在完全合焦的平面上,所以在胶片上的图像会是一个模糊区域p1’。p2点是在焦距平面上,所以它在胶片上的图像是一个点p2’而且它是合焦的。不论是增加光圈的大小还是增加物体与焦距平面之间的距离都会增加失焦目标的模糊程度。从透镜到目标呈现合焦状态所在的距离范围被称作透镜的景深。投影相机有两个关于景深的额外参数:一是设置透镜光圈的大小,另一个是设置焦距。

光线的起点是透镜上的点。光线的方向使用斯涅尔定律来计算,它描述了光线在通过一个介质(如空气)到另一个介质(如玻璃)的折射行为。我们知道从给定的图像抽样中通过透镜传来的光线必须聚集在聚焦平面上的同一个点。不仅如此,我们知道通过透镜中心的光线是不会受到折射的,所以找到合适的聚集点事实上是从小孔模型和聚焦平面上交叉未受扰动的光线并设置光线为透镜上的点到交点方向的问题。

对于这个抽样模型,聚焦平面垂直于z轴,光线起始于原点,所以通过透镜中心到聚焦平面上的光线是一条直线。

本次专利使用带有变焦功能的透镜的摄像机模型,以实现可实时变焦的光线追踪渲染。

附图说明

附图1摄像机模型与三维模型场景示意图”

附图2小孔摄像机模型示意图

附图3透镜成虚像现象示意图

附图4光线追踪流程图

附图5失焦处理流程图

附图6纹理采样图

具体实施方式

本专利使用c++编程语言完成了实时变焦光线追踪程序的编程。在程序设计的blendercamera结构中使用aperturesize,apertureratio和focaldistance等参数表达模拟摄像头中的光圈大小参数和焦距等参数,这些个参数都可以在程序启动以后接受用户的实时控制,并在短时间内刷新渲染效果。

如附图4所示,光线追踪渲染过程由两个部分构成:左边的追踪计算部分,和右边的着色计算部分。

首先,读取三维场景的数据文件,在数据文件中,由图元组成三维场景;

第二,从摄像机发出射线。射线的出发点是视点,经过虚拟摄像机模型上的镜头上的每一个像素进入三维场景;

第三,计算射线是否与场景中的图元相交,如果相交,则返回与光线相交的图元的id;

第四,将与光线相交的图元id输入着色模块,着色模块计算两个数据:(1)模拟光线在物体表面发生的光学现象,如反射或折射,并将反射或折射产生的刺激广西返回追踪射线模块进行光线追踪的光路计算;(2)通过光向量计算颜色和阴影。

如此反复迭代,直到光线发生反射或折射的次数达到预设的值,结束追踪。

本专利的独创性在于,使用了可变焦的虚拟摄像机模型,在模型实现了由虚拟摄像机发射的光线模拟真实的摄像机的焦距特性的功能,并且实现了实时变焦的功能。

在classcamera定义如下参数,以实现实时变焦的功能:focaldistance和aperturesize分别表示虚拟摄像机的焦距和透光孔径,在程序中实时改变这两个参数,既可以达到实时变焦的功能。

由计算机渲染出的图片通常处处锐利,这一点有异于真实照相机拍摄的效果。在三维建模应用中,大部分时候动画工程师需要处处锐利的渲染效果,以观察虚拟场景中的每一个细节;然而,对模拟真实摄像机拍摄效果的需求也存在,特别是电影特效制作过程中需要能够实时观察到虚拟的场景在真实摄像机镜头下有失焦效果的渲染结果。本次论文设计了一种用于光线追踪的虚拟摄像机模型,而非渲染引擎中常用的针孔摄像机模型。

在针孔相机模型中,场景中的光线经过一个无限小的针孔进入摄像机。很显然这些光线仅占到虚拟三维场景中的一部分,没有进入针孔的光线都被忽略了。这样的虚拟相机模型渲染出来的图片是处处锐利的。在真实世界中,所有的镜头都有一个有限大小的透光孔径,所有从场景中发射的,穿过透光孔径的光线都在底片上成像。薄透镜的成像公式为:1/u+1/v=1/f,其中f为薄透镜焦点到凸透镜光心的距离,u为物体到凸透镜光心的距离,v为物体经凸透镜所成的像到凸透镜光心的距离。在场景中,一个物体发射出的多根光线穿过透镜,如果物体位于焦平面,那么物体所成的像为锐利的像;如果物体位于焦平面以外,那么物体在视平面上成模糊的像。

通常有两种算法用来处理失焦现象:一种模拟失焦现象的方式是:从每一个像素点发出多条光线,这一组光线或者都打到的处于焦点的物体,或者散射到场景中与位于其他位置的图元相交。这种方式可以得到最接近真实效果的渲染图片,但由于计算量太大,无法使用软件模拟。另一种模拟失焦现象的方法使用累计缓冲,将多次渲染的结果综合成一次渲染的图片,每一次渲染的图片都选取位于透光孔内不同位置的针孔。这种方法的计算成本也很高,为了得到较好的失焦效果渲染,需要多次无失焦渲染。

本次论文采用了另一种更适合于实时渲染的方式:预处理方式。我们参考了波特梅塞尔和查克拉瓦迪的论文《使用计算机产生动态模糊的图片》。在第一个阶段,我们通过渲染场景获得色彩信息和模糊度参数等用于第二阶段的信息;在第二个阶段,使用一个大小可变的滤波器处理第一阶段渲染的结果,以模拟失焦现象。

第一,整体三维场景经过渲染,得到处处锐利的渲染结果和用于描述每一个像素的失焦程度的景深和模糊度参数。定义模糊度参数的范围为[0,1],0表示像素锐利,1表示最大程度失焦,对于每一个像素,最大的失焦程度定义为失焦圈半径(coc,circleofconfusion)。对于画面上的每一个像素,使用如下代码计算失焦程度:

第二,进行向下采样,渲染出一个四分之一大小的画面,将其放入缓存中。在向下采样的过程中,渲染通道接收每个像素的模糊度参数,该参数用于预处理过后的模糊化。下面是对像素向下采样的代码:

第三,在得到模糊度参数之后,要对渲染的图片进行模糊处理。通常使用高斯滤波器对图像进行光滑处理,典型的高斯滤波方式是:其中f是目标像素经过滤波之后的数值,p是二维图像中的像素,c是二维高斯矩阵中的系数,n是矩阵的大小s是高斯矩阵中左右数值之和。用卷积方式处理高斯光滑。由于二维异向的高斯光滑可以将两个维度的光滑分别处理,这样进行卷积计算的速度会比二维卷积更快。下面的代码是高斯滤波核:

第四,对于向下采样的结果分别在x方向和y方向进行滤波。对于在向下采样结果图片中的每一个像素,采样n个纹理样,如附图6所示。

其中,位于中心的一块,及靠近中心的六块使用插值纹理坐标,在顶点着色中计算出来。计算第一组采样的偏移量时,我们使用输入纹理坐标和基于图片解析度的预先计算好的偏移量。下面是x方向像素着色的高斯滤波代码,y方向的滤波过程与其类似。

第五,使用缓存中的距离焦平面距离参数综合处最终的失焦效果。rendertexture用于从全幅画面中采样,blurredxytexture用于从经过高斯滤波的向下采样图像中采样。全部的纹理都用插值纹理坐标表示。

在真实世界中,有相同的透光孔径和焦距的不同的透镜成像结果也是稍有不同的。失焦或者模糊图片的现象被摄影师称为“背景虚化”。理论上完美的镜头不应该产生球面像差,完美的透镜应该将所有进入透光孔的光线聚拢透镜后的光椎当中。然而所有真实的镜头都有不同程度的球面像差存在,透镜后的光线也不是均匀地分布在光椎中。镜头的光圈和快门叶片的数目对于背景虚化也有影响。摄影师和动画制作者对背景虚化的需求是因地制宜地,没有固定的模糊度可以满足所有场合的需求。本次论文实现的失焦光线追踪渲染满足了这一实时应变的需求。我们使用xml格式的文件描述三维场景,使用blender软件中的猴子模型和开源的飞行器作为渲染目标,进行了不同参数下的渲染,体现了背景虚化的效果,并且对于较小的场景模型实现了实时可变焦的渲染。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1