【专利】基于GPU的快速烘焙AO贴图
发表于2018-02-01
本文首发于知乎专栏:MACK的游戏开发笔记,欢迎各位关注。
开发轩辕传奇时申请的一个专利,主要用于解决快速烘焙AO贴图的问题。一开始我们集成了Beast插件来进行全局光烘焙,但是烘焙一个场景需要二十个小时,而XY有上百个关卡,并且每次只能等烘焙完毕才能看到效果,更关键的是当时的Beast也不支持分布式AO烘焙。如果使用Beast将会极大影响关卡的开发进度。在这种条件下,我们自主开发了使用GPU来快速烘焙AO贴图的方法,原理很简单,通过建立球形分布的光源多次叠加每个光源的阴影,然后做一些累加和后处理最终得到AO贴图。但实际的实现过程还是有很多难点和坑的。
经过无数不眠之夜。。。最终的效果很明显,使用新的方式烘焙一个场景只需要2分钟,并且支持单个物件或者单个地块的AO快速预览,支持后期的gamma矫正,效果上也和Beast的效果接近。
描述文档就是会写的这么晦涩。。。 http://www.pss-system.gov.cn/sipopublicsearch/patentsearch/showViewList-jumpToView.shtml
本发明实施例公开了一种基于GPU的AO贴图烘焙方法及系统,方法包括:在CPU内建立以待渲染物体为中心,呈球形或半球形分布的点,在每个点的位置模拟光照朝向待渲染物体的射线光源;利用选取的一个射线光源处的摄像机拍摄待渲染物体周围一定范围内的场景,将该场景连同摄像机的参数传入GPU中;在GPU中对场景进行渲染,获取场景深度图;利用不处于射线光源处的摄像机拍摄待渲染物体,在对待渲染物体进行渲染后获取渲染深度值,计算每个像素点的阴影值,根据每个像素点的阴影值、权重及预设的经验系数计算待渲染物体在一个射线光源方向的AO值并生成AO贴图,遍历所有射线光源,将所有射线光源方向的AO贴图叠加并显示。本发明实施例能够提高贴图烘焙效率。
1、一种基于图形处理器GPU的环境光遮挡AO贴图烘焙方法,其特征在于,包括:
在中央处理器CPU内建立以待渲染物体为中心,呈球形或半球形分布的点,在每个点的位置模拟光照朝向待渲染物体的射线光源;
选取一个射线光源,利用处于所述射线光源处的摄像机拍摄所述待渲染物体周围一定范围内的场景,将所述摄像机拍摄的待渲染物体周围一定范围内的场景及所述摄像机的参数利用预设的算法传入GPU中,所述摄像机采用平行投影方式投影,所述摄像机的参数为视空间矩阵和投影矩阵;
在所述GPU中对所述摄像机拍摄的场景进行渲染,获取场景深度图,所述场景深度图中保存了所述摄像机拍摄的场景中的每个像素点的场景深度值;
利用不处于射线光源处的摄像机,使用平行投影的方式单独拍摄所述待渲染物体,对所述待渲染物体进行渲染,获取所述待渲染物体的顶点坐标,将所述顶点坐标与世界坐标矩阵相乘之后,再与所述射线光源处的摄像机的视空间矩阵和投影矩阵相乘,得到待渲染物体的渲染深度值;
根据每个像素点的场景深度值及渲染深度值计算所述像素点的阴影值,将所述像素点的阴影值乘以权重及预设的经验系数得到所述像素点的AO 值,所述权重包括所述射线光源的光照方向与所述像素点的法线方向的点积,以及所述射线光源的总数的倒数;依次计算所述待渲染物体上的每个像素点的AO值,得到所述待渲染物体在所述射线光源方向的AO值;
根据所述待渲染物体在所述射线光源方向的AO值生成所述待渲染物体在所述射线光源方向的AO贴图;
依次遍历每一个射线光源,得到所述待渲染物体在所有射线光源方向的AO贴图;
将所述待渲染物体在所有射线光源方向的AO贴图叠加形成一张完整AO贴图并显示。
2、如权利要求1所述的方法,其特征在于,在将所述完整AO贴图进行显示之前,还包括:
将所述完整AO贴图贴到模型上,根据所述完整AO贴图在模型上的显示效果对所述完整AO贴图进行Gamma矫正。
3、如权利要求1所述的方法,其特征在于,所述根据每个像素点的场景深度值及渲染深度值计算所述像素点的阴影值的方法具体为:
当所述像素点的渲染深度值大于所述场景深度值时,认为所述像素点的阴影值为1,当所述像素点的渲染深度值小于或等于所述场景深度值时,认为所述像素点的阴影值为0。
4、如权利要求1所述的方法,其特征在于,所述将所述摄像机拍摄的待渲染物体周围一定范围内的场景及所述摄像机的参数利用预设的算法传入GPU中之后,还包括:
过滤所述场景内的动态模型。
5、如权利要求1至4任意一项所述的方法,其特征在于,所述射线光源为900个。
6、如权利要求1至4任意一线所述的方法,其特征在于,所述预设的算法包括:四叉树、八叉树、九宫。
7、一种基于图形处理器GPU的环境光遮挡AO贴图烘焙系统,其特征在于,包括中央处理器CPU,GPU及显示器,其中:
所述CPU用于,建立以待渲染物体为中心,呈球形或半球形分布的点,在每个点的位置模拟光照朝向待渲染物体的射线光源;选取一个射线光源,利用处于所述射线光源处的摄像机拍摄所述待渲染物体周围一定范围内的场景,将所述摄像机拍摄的待渲染物体周围一定范围内的场景及所述摄像机的参数利用预设的算法传入GPU中,所述摄像机采用平行投影方式投影,所述摄像机的参数为视空间矩阵和投影矩阵;
所述GPU包括:
第一渲染单元,用于对所述射线光源处的摄像机拍摄的场景进行渲染,获取场景深度图,所述场景深度图中保存了所述摄像机拍摄的场景中的每个像素点的场景深度值;
第二渲染单元,用于利用不处于射线光源处的摄像机,使用平行投影的方式单独拍摄所述待渲染物体,对所述待渲染物体进行渲染,获取所述待渲染物体的顶点坐标,将所述顶点坐标与世界坐标矩阵相乘之后,再与所述射线光源处的摄像机的视空间矩阵和投影矩阵相乘,得到渲染深度值;
AO贴图生成单元,用于根据每个像素点的场景深度值及渲染深度值计算所述像素点的阴影值,将所述像素点的阴影值乘以权重及预设的经验系数得到所述像素点的AO 值,所述权重包括所述射线光源的光照方向与所述像素点的法线方向的点积,以及所述射线光源的总数的倒数;依次计算所述待渲染物体上的每个像素点的AO值,得到所述待渲染物体在所述射线光源方向的AO值;根据所述待渲染物体在所述射线光源方向的AO值生成所述待渲染物体在所述射线光源方向的AO贴图;依次遍历每一个射线光源,得到所述待渲染物体在所有射线光源方向的AO贴图;将所述待渲染物体在所有射线光源方向的AO贴图叠加形成一张完整AO贴图;
所述显示器用于,显示所述完整AO贴图。
8、如权利要求7所述的系统,其特征在于,所述GPU还包括:
修正单元,用于将所述完整AO贴图贴到模型上,根据所述完整AO贴图在模型上的显示效果对所述完整AO贴图进行Gamma矫正。
9、如权利要求7所述的系统,其特征在于,所述AO贴图生成单元根据每个像素点的场景深度值及渲染深度值计算所述像素点的阴影值的方法具体为:
当所述像素点的渲染深度值大于所述场景深度值时,认为所述像素点的阴影值为1,当所述像素点的渲染深度值小于或等于所述场景深度值时,认为所述像素点的阴影值为0。
10、如权利要求7所述的系统,其特征在于,所述第一渲染单元还用于:
过滤所述CPU传入的待渲染物体周围一定范围内的场景中的动态模型。
11、如权利要求7至10任意一项所述的系统,其特征在于,所述射线光源为900个。
12、如权利要求7至10任意一项所述的系统,其特征在于,所述预设的算法包括:四叉树、八叉树、九宫。
一种基于GPU的AO贴图烘焙方法及系统
技术领域
本发明实施例涉及图像处理技术领域,尤其涉及一种基于GPU的AO贴图烘焙方法及系统。
背景技术
在网络游戏蓬勃发展的今天,人们对游戏场景的真实感要求越来越高。环境光遮挡(Ambient Occlusion,AO)是全局光照(Global Illumination,GI)技术中的重要组成部分,AO描述了物体表面上每个点与场景中其他物体的遮挡值,通常使用AO来衰减光照在物体表面的光照值,增强空间的层次感,场景的真实感,增强画面的艺术性。
但是在游戏开发的过程中,我们发现,目前市场上主流的商业烘焙软件多是基于中央处理器(Central Processing Unit,CPU)的,而CPU对图形的处理效率比较低,所以导致AO贴图的烘焙效率也非常低,通常烘焙一张AO贴图需要好几个小时;也有一些烘焙软件可以将一部分处理过程放在CPU上,另一部分处理过程放在图形处理器(Graphic Processing Unit,GPU)上,但是这类烘焙软件中涉及到的算法往往很复杂,最终还是会产生烘焙效率低的问题。
因此,有必要提供一种新的方法解决上述问题。
发明内容
本发明实施例提供了一种基于GPU的AO贴图烘焙方法及系统,能够提高AO贴图的烘焙效率。
本发明实施例提供的基于GPU的AO贴图烘焙方法,包括:
在中央处理器CPU内建立以待渲染物体为中心,呈球形或半球形分布的点,在每个点的位置模拟光照朝向待渲染物体的射线光源;
选取一个射线光源,利用处于所述射线光源处的摄像机拍摄所述待渲染物体周围一定范围内的场景,将所述摄像机拍摄的待渲染物体周围一定范围内的场景及所述摄像机的参数利用预设的算法传入GPU中,所述摄像机采用平行投影方式投影,所述摄像机的参数为视空间矩阵和投影矩阵;
在所述GPU中对所述摄像机拍摄的场景进行渲染,获取场景深度图,所述场景深度图中保存了所述摄像机拍摄的场景中的每个像素点的场景深度值;
利用不处于射线光源处的摄像机,使用平行投影的方式单独拍摄所述待渲染物体,对所述待渲染物体进行渲染,获取所述待渲染物体的顶点坐标,将所述顶点坐标与世界坐标矩阵相乘之后,再与所述射线光源处的摄像机的视空间矩阵和投影矩阵相乘,得到待渲染物体的渲染深度值;
根据每个像素点的场景深度值及渲染深度值计算所述像素点的阴影值,将所述像素点的阴影值乘以权重及预设的经验系数得到所述像素点的AO 值,所述权重包括所述射线光源的光照方向与所述像素点的法线方向的点积,以及所述射线光源的总数的倒数;依次计算所述待渲染物体上的每个像素点的AO值,得到所述待渲染物体在所述射线光源方向的AO值;
根据所述待渲染物体在所述射线光源方向的AO值生成所述待渲染物体在所述射线光源方向的AO贴图;
依次遍历每一个射线光源,得到所述待渲染物体在所有射线光源方向的AO贴图;
将所述待渲染物体在所有射线光源方向的AO贴图叠加形成一张完整AO贴图并显示。
本发明实施例提供的基于GPU的AO贴图烘焙系统包括:包括中央处理器CPU,GPU及显示器,其中:
所述CPU用于,建立以待渲染物体为中心,呈球形或半球形分布的点,在每个点的位置模拟光照朝向待渲染物体的射线光源;选取一个射线光源,利用处于所述射线光源处的摄像机拍摄所述待渲染物体周围一定范围内的场景,将所述摄像机拍摄的待渲染物体周围一定范围内的场景及所述摄像机的参数利用预设的算法传入GPU中,所述摄像机采用平行投影方式投影,所述摄像机的参数为视空间矩阵和投影矩阵;
所述GPU包括:
第一渲染单元,用于对所述射线光源处的摄像机拍摄的场景进行渲染,获取场景深度图,所述场景深度图中保存了所述摄像机拍摄的场景中的每个像素点的场景深度值;
第二渲染单元,用于利用不处于射线光源处的摄像机,使用平行投影的方式单独拍摄所述待渲染物体,对所述待渲染物体进行渲染,获取所述待渲染物体的顶点坐标,将所述顶点坐标与世界坐标矩阵相乘之后,再与所述射线光源处的摄像机的视空间矩阵和投影矩阵相乘,得到渲染深度值;
AO贴图生成单元,用于根据每个像素点的场景深度值及渲染深度值计算所述像素点的阴影值,将所述像素点的阴影值乘以权重及预设的经验系数得到所述像素点的AO 值,所述权重包括所述射线光源的光照方向与所述像素点的法线方向的点积,以及所述射线光源的总数的倒数;依次计算所述待渲染物体上的每个像素点的AO值,得到所述待渲染物体在所述射线光源方向的AO值;根据所述待渲染物体在所述射线光源方向的AO值生成所述待渲染物体在所述射线光源方向的AO贴图;依次遍历每一个射线光源,得到所述待渲染物体在所有射线光源方向的AO贴图;将所述待渲染物体在所有射线光源方向的AO贴图叠加形成一张完整AO贴图。
所述显示器用于,显示所述完整AO贴图。
从以上技术方案可以看出,本发明实施例具有以下优点:
本发明实施例中,在CPU中建立以待渲染物体为中心,呈球形或半球形分布的点,在每个点的位置模拟光照朝向待渲染物体的射线光源;选取一个射线光源,利用处于所述射线光源处的摄像机拍摄所述待渲染物体周围一定范围内的场景,将摄像机拍摄的待渲染物体周围一定范围内的场景及摄像机的参数利用预设的算法传入GPU中,然后在GPU中对传入的场景及待渲染物体进行渲染,根据每个像素点的场景深度值、渲染深度值、权重及预设的经验系数计算待渲染物体的AO值,生成最终的AO贴图,本发明实施例中,将图形的主要处理过程放在了GPU中,且在处理过程中涉及的算法较为简单,提高了AO贴图的烘焙效率。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明基于GPU的AO贴图烘焙方法一个实施例示意图;
图2为本发明基于GPU的AO贴图烘焙方法另一实施例示意图;
图3为本发明基于GPU的AO贴图烘焙系统一个实施例示意图;
图4为未经处理的AO贴图;
图5为经过Gamma矫正的AO贴图。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明实施方式作进一步地详细描述。
本发明实施例提供了一种基于GPU的AO贴图烘焙方法及系统,能够提高AO贴图的烘焙效率。
请参阅图1,本发明基于GPU的AO贴图烘焙方法一个实施例包括:
101、在CPU内建立以待渲染物体为中心,呈球形或半球形分布的点,在每个点的位置模拟光照朝向待渲染物体的射线光源;
本实施例中,首先在CPU内建立以待渲染物体为中心,呈球形或半球形分部的点,然后在每个点的位置模拟射线光源,所有射线光源发出的光均朝向待渲染物体,所有射线光源发出的光对待渲染物体影响的集合就是最终的环境光。
每个摄像光源处都有一个摄像机,用于从该射线光源的角度拍摄待渲染物体周围一定范围内的场景。
102、选取一个射线光源,利用处于该射线光源处的摄像机拍摄待渲染物体周围一定范围内的场景,将场景及摄像机的参数传入GPU中;
射线光源处的摄像机一般以平行投影方式拍摄待渲染物体周围一定范围内的场景,拍摄的场景中包括待渲染物体,其他的物件、地形等;将场景与摄像机的参数传入GPU时可利用预设的算法进行传入,传入GPU内的摄像机的参数可以包括视空间矩阵、投影矩阵、镜头位置等。
103、在GPU中对场景进行渲染,获取场景深度图,场景深度图中保存了场景中的每个像素点的场景深度值;
因GPU对图形的处理能力优于CPU,所以本实施例中,将CPU内摄像机拍摄的场景及摄像机的参数传入GPU,在GPU中对场景进行渲染,得到场景深度图,场景深度图中保存了当前摄像机拍摄的场景中每个像素点的场景深度值。
104、利用不处于射线光源处的摄像机单独拍摄待渲染物体,对待渲染物体进行渲染,获取渲染深度值;
另外用一个摄像机单独拍摄待渲染物体,这个摄像机不是处于射线光源位置处的摄像机,且这个摄像机所选取的拍摄角度要能拍摄到完整的待渲染物体,对单独拍摄的待渲染物体进行渲染。
获取待渲染物体的顶点坐标,将待渲染物体的顶点坐标与世界坐标矩阵相乘之后,再与射线光源处的摄像机的参数,即视空间矩阵和投影矩阵相乘,得到待渲染物体的渲染深度值,待渲染物体的渲染深度值中包含待渲染物体的每一个像素点的渲染深度值。
105、根据每个像素点的场景深度值、渲染深度值,权重及预设的经验系数计算每个像素点的AO值,得到待渲染物体在一个射线光源方向的AO值;
根据一个像素点的场景深度值及渲染深度值可得到该像素点的阴影值,将该像素点的阴影值乘以权重及预设的经验系数即可得到该像素点的AO值,其中,权重包括:射线光源的光照方向与该像素点的法线方向的点积,以及射线光源的总数的倒数;依次计算待渲染物体上的每一个像素点的AO值,即可得到待渲染物体在一个射线光源方向的AO值。
106、根据上述AO值生成待渲染物体在一个射线光源方向的AO贴图,遍历每个射线光源,将待渲染物体在所有射线光源方向的AO贴图叠加并显示。
本实施例中,在CPU中建立以待渲染物体为中心,呈球形或半球形分布的点,在每个点的位置模拟光照朝向待渲染物体的射线光源;选取一个射线光源,利用处于所述射线光源处的摄像机拍摄所述待渲染物体周围一定范围内的场景,将摄像机拍摄的待渲染物体周围一定范围内的场景及摄像机的参数利用预设的算法传入GPU中,然后在GPU中对传入的场景及待渲染物体进行渲染,根据每个像素点的场景深度值、渲染深度值、权重及预设的经验系数计算待渲染物体的AO值,生成最终的AO贴图,本实施例中,将图形的主要处理过程放在了GPU中,且在处理过程中涉及的算法较为简单,提高了AO贴图的烘焙效率。
为便于理解,下面以一具体实施例对本发明实施例中基于GPU的AO贴图烘焙方法进行描述,请参阅图2,本实施例方法包括:
201、在CPU内建立以待渲染物体为中心,呈球形或半球形分布的点,在每个点的位置模拟光照朝向待渲染物体的射线光源;
本实施例中,首先在CPU内建立以待渲染物体为中心,呈球形或半球形分部的点,然后在每个点的位置模拟射线光源,所有射线光源发出的光均朝向待渲染物体,所有射线光源发出的光对待渲染物体影响的集合就是最终的环境光。
经过实测发现,900个射线光源是比较理想的数量,每个摄像光源处都有一个摄像机,用于从该射线光源的角度拍摄待渲染物体周围一定范围内的场景。
202、选取一个射线光源,利用处于该射线光源处的摄像机拍摄待渲染物体周围一定范围内的场景,将场景及摄像机的参数传入GPU中;
射线光源处的摄像机一般以平行投影方式拍摄待渲染物体周围一定范围内的场景,拍摄的场景中包括待渲染物体、其他物件、地形等。
将场景与摄像机的参数可利用预设的四叉树、或八叉树,或九宫等算法传入GPU,传入GPU内的摄像机的参数可以包括视空间矩阵、投影矩阵、镜头位置等。
203、过滤待渲染物体周围一定范围内的场景内的动态模型;
将场景传入GPU后,GPU过滤掉场景内的动态模型,这些动态模型指的是粒子,带骨骼动画和模型动画等。
204、在GPU中对场景进行渲染,获取场景深度图,场景深度图中保存了场景中的每个像素点的场景深度值;
因GPU对图形的处理能力优于CPU,所以本实施例中,将CPU内摄像机拍摄的场景及摄像机的参数传入GPU,在GPU中对场景进行渲染,得到场景深度图,场景深度图中保存了当前摄像机拍摄的场景中每个像素点的场景深度值。
205、利用不处于射线光源处的摄像机单独拍摄待渲染物体,对待渲染物体进行渲染,获取渲染深度值;
另外用一个摄像机单独拍摄待渲染物体,这个摄像机不是处于射线光源位置处的摄像机,且这个摄像机所选取的拍摄角度要能拍摄到完整的待渲染物体,对单独拍摄的待渲染物体进行渲染。
获取待渲染物体的顶点坐标,将待渲染物体的顶点坐标与世界坐标矩阵相乘之后,再与射线光源处的摄像机的参数,即视空间矩阵和投影矩阵相乘,得到待渲染物体的渲染深度值,待渲染物体的渲染深度值中包含待渲染物体的每一个像素点的渲染深度值。
206、根据每个像素点的场景深度值、渲染深度值,权重及预设的经验系数计算每个像素点的AO值,得到待渲染物体在一个射线光源方向的AO值;
根据一个像素点的场景深度值及渲染深度值可得到该像素点的阴影值。具体地,如果该像素点的渲染深度值大于场景深度值时,则认为该像素点处于阴影中,该像素点对应的阴影值为1,如果该像素点的渲染深度值小于或等于场景深度值时,则认为该像素点不在阴影中,该像素点对应的阴影值为0。
将该像素点的阴影值乘以权重及预设的经验系数即可得到该像素点的AO值,其中,权重包括:射线光源的光照方向与该像素点的法线方向的点积,以及射线光源的总数的倒数。本实施例中射线光源为900个,射线光源的总数的倒数就为1/900,预设的经验系数根据实验测得为0.15较为合适。
依次计算待渲染物体上的每一个像素点的AO值,即可得到待渲染物体在一个射线光源方向的AO值。
207、生成待渲染物体在一个射线光源方向的AO贴图,遍历每个射线光源,将待渲染物体在所有射线光源方向的AO贴图叠加形成一张完整AO贴图;
GPU根据待渲染物体在一个射线光源方向的AO值生成一张AO贴图,AO贴图的分辨率可根据待渲染物体的大小进行设置。重复步骤202至207,依次遍历每一个射线光源,最终生成待渲染物体在900个射线光源方向的900张AO贴图,将这900张AO贴图叠加形成一张完整的AO贴图,同样完整AO贴图的分辨率也可以根据待渲染物体的大小进行设置。
这张完整的AO贴图可能存在锯齿和纹理像素的溢出导致的黑边。锯齿可以采用阴影的“百分比渐进过滤”进行处理,每个像素去上下左右和自己取平均数。像素的溢出可通过扩充有效像素来解决。具体地,可在像素着色器中判断当前像素是否无效,若果无效,则采样其周围8个像素,累加其中的有效像素,获取有效像素的平均值,将这个平均值作为当前像素的阴影值, 并设置当前像素有效。这样就实现了将完整AO贴图扩展一个像素防止采样过界。
208、将完整AO贴图贴到模型上进行显示,根据显示效果对完整AO贴图进行Gamma矫正。
将完整AO贴图贴到模型上进行显示,使用颜色图表(Color Chart)来调整AO贴图的显示效果,以解决场景中因加入AO导致的场景整体变暗的问题。具体的效果请参阅图4及图5,图4表示的是未做Gamma矫正的显示效果,图5表示的是做了Gamma矫正之后的显示效果。
本实施例中,在CPU中建立以待渲染物体为中心,呈球形或半球形分布的点,在每个点的位置模拟光照朝向待渲染物体的射线光源;选取一个射线光源,利用处于所述射线光源处的摄像机拍摄所述待渲染物体周围一定范围内的场景,将摄像机拍摄的待渲染物体周围一定范围内的场景及摄像机的参数利用预设的算法传入GPU中,然后在GPU中对传入的场景及待渲染物体进行渲染,根据每个像素点的场景深度值、渲染深度值、权重及预设的经验系数计算待渲染物体的AO值,生成最终的AO贴图,将最终的AO贴图进行修正后输出。本实施例中,将图形的主要处理过程放在了GPU中,且在处理过程中涉及的算法较为简单,因此大大提高了AO贴图的烘焙效率,经实验测得,使用本实施例提供的方法烘焙一张AO贴图只需要几分钟。
下面对本发明中的基于GPU的AO贴图烘焙系统进行描述,请参阅图3,本发明基于GPU的AO贴图烘焙系统一个实施例包括:CPU 301,GPU 302及显示器303,其中:
所述CPU 301用于,建立以待渲染物体为中心,呈球形或半球形分布的点,在每个点的位置模拟光照朝向待渲染物体的射线光源;选取一个射线光源,利用处于射线光源处的摄像机拍摄待渲染物体周围一定范围内的场景,将摄像机拍摄的待渲染物体周围一定范围内的场景及摄像机的参数利用预设的算法传入GPU中,摄像机采用平行投影方式投影,摄像机的参数为视空间矩阵和投影矩阵;
GPU 302包括:
第一渲染单元3021,用于对射线光源处的摄像机拍摄的场景进行渲染,获取场景深度图,场景深度图中保存了当前摄像机拍摄的场景中的每个像素点的场景深度值;
第二渲染单元3022,用于利用不处于射线光源处的摄像机,使用平行投影的方式单独拍摄所述待渲染物体,对待渲染物体进行渲染,获取待渲染物体的顶点坐标,将顶点坐标与世界坐标矩阵相乘之后,再与射线光源处的摄像机的视空间矩阵和投影矩阵相乘,得到渲染深度值;
AO贴图生成单元3023,用于根据一个像素点的场景深度值及渲染深度值计算该像素点的阴影值,将该像素点的阴影值乘以权重及预设的经验系数得到该像素点的AO 值,其中,权重包括射线光源的光照方向与该像素点的法线方向的点积,以及射线光源的总数的倒数;依次计算待渲染物体上的每个像素点的AO值,得到待渲染物体在该射线光源方向的AO值;根据待渲染物体在该射线光源方向的AO值生成待渲染物体在该射线光源方向的AO贴图;依次遍历每一个射线光源,得到待渲染物体在所有射线光源方向的AO贴图;将待渲染物体在所有射线光源方向的AO贴图叠加形成一张完整AO贴图;
显示器303用于,显示完整AO贴图。
另外,GPU 302还包括:
修正单元3024,用于将完整AO贴图贴到模型上,根据完整AO贴图在模型上的显示效果对完整AO贴图进行Gamma矫正。
为便于理解,下面以一个实际应用场景对本实施例中基于GPU的AO贴图烘焙系统内的各部分之间的交互方式进行描述:
CPU 301首先建立以待渲染物体为中心,呈球形或半球形分部的点,然后在每个点的位置模拟射线光源,所有射线光源发出的光均朝向待渲染物体,所有射线光源发出的光对待渲染物体影响的集合就是最终的环境光。
经过实测发现,900个射线光源是比较理想的数量,每个摄像光源处都有一个摄像机,用于从该射线光源的角度拍摄待渲染物体周围一定范围内的场景。
CPU 301选取一个射线光源,利用处于该射线光源处的摄像机以平行投影方式拍摄待渲染物体周围一定范围内的场景。因GPU 302对图形的处理能力优于CPU 301,所以CPU 301将场景及摄像机的参数利用预设的四叉树、或八叉树,或九宫算法传入GPU 302。
其中,拍摄的场景中包括待渲染物体、其他物件、地形等;传入GPU内的摄像机的参数可以包括视空间矩阵、投影矩阵、镜头位置等。
在CPU 301将场景及摄像机的参数传入GPU 302后,GPU 302过滤掉场景内的动态模型,这些动态模型指的是粒子,带骨骼动画和模型动画等。
GPU 302内的第一渲染单元3021对CPU 301传入的场景进行渲染,得到场景深度图,场景深度图中保存了当前摄像机拍摄的场景中每个像素点的场景深度值。
GPU 302内的第二渲染单元3022另外用一个摄像机单独拍摄待渲染物体,这个摄像机不是处于射线光源位置处的摄像机,且这个摄像机所选取的拍摄角度要能拍摄到完整的待渲染物体,第二渲染单元3022对单独拍摄的待渲染物体进行渲染,获取待渲染物体的顶点坐标,将待渲染物体的顶点坐标与世界坐标矩阵相乘之后,再与射线光源处的摄像机的参数,即视空间矩阵和投影矩阵相乘,得到待渲染物体的渲染深度值,待渲染物体的渲染深度值中包含待渲染物体的每一个像素点的渲染深度值。
GPU 302内AO贴图生成单元3023根据每个像素点的场景深度值、渲染深度值,权重及预设的经验系数计算每个像素点的AO值,得到待渲染物体在一个射线光源方向的AO值。
具体地,AO贴图生成单元3023首先根据一个像素点的场景深度值及渲染深度值可得到该像素点的阴影值。其中,如果该像素点的渲染深度值大于场景深度值时,则认为该像素点处于阴影中,该像素点对应的阴影值为1,如果该像素点的渲染深度值小于或等于场景深度值时,则认为该像素点不在阴影中,该像素点对应的阴影值为0。
将该像素点的阴影值乘以权重及预设的经验系数即可得到该像素点的AO值,其中,权重包括:射线光源的光照方向与该像素点的法线方向的点积,以及射线光源的总数的倒数。本实施例中射线光源为900个,射线光源的总数的倒数就为1/900,预设的经验系数根据实验测得为0.15较为合适。
AO贴图生成单元3023依次计算待渲染物体上的每一个像素点的AO值,即可得到待渲染物体在一个射线光源方向的AO值。
在得到待渲染物体在一个射线光源方向的AO值之后,AO贴图生成单元3023就可以生成待渲染物体在一个射线光源方向的AO贴图,AO贴图的分辨率可根据待渲染物体的大小进行设置。
依次遍历每一个射线光源,AO贴图生成单元3023将生成待渲染物体在900个射线光源方向的900张AO贴图,将这900张AO贴图叠加之后就形成了一张完整的AO贴图,同样完整AO贴图的分辨率也可以根据待渲染物体的大小进行设置。
这张完整的AO贴图可能存在锯齿和纹理像素的溢出导致的黑边。修正单元3024可以采用阴影的“百分比渐进过滤”对锯齿进行处理,每个像素去上下左右和自己取平均数。对于像素的溢出,修正单元3024可通过扩充有效像素来解决。具体地,修正单元3024可在像素着色器中判断当前像素是否无效,若果无效,则采样其周围8个像素,累加其中的有效像素,获取有效像素的平均值,将这个平均值作为当前像素的阴影值, 并设置当前像素有效。这样就实现了将完整AO贴图扩展一个像素防止采样过界。
最后修正单元3024将完整AO贴图贴到模型上进行显示,使用颜色图表(Color Chart)来调整AO贴图的显示效果,以解决场景中因加入AO导致的场景整体变暗的问题。
本实施例中,在CPU中建立以待渲染物体为中心,呈球形或半球形分布的点,在每个点的位置模拟光照朝向待渲染物体的射线光源;选取一个射线光源,利用处于所述射线光源处的摄像机拍摄所述待渲染物体周围一定范围内的场景,将摄像机拍摄的待渲染物体周围一定范围内的场景及摄像机的参数利用预设的算法传入GPU中,然后在GPU中,第一渲染单元对传入的场景进行渲染,第二渲染单元对待渲染物体进行渲染,AO贴图生成单元根据每个像素点的场景深度值、渲染深度值、权重及预设的经验系数计算待渲染物体的AO值,生成最终的AO贴图,并将最终的AO贴图修正后输出。本实施例中,将图形的主要处理过程放在了GPU中,且在处理过程中涉及的算法较为简单,因此大大提高了AO贴图的烘焙效率,经实验测得,使用本实施例提供的方法烘焙一张AO贴图只需要几分钟。
应当理解的是,本文中虽然使用术语第一、第二等描述各个元件,但是这些元件应该不受这些术语的限制。这些术语仅被用于彼此区分元件。例如,第第一触发信号也可以称之为第二触发信号,第二触发信号也可被称之为第一接触。而不脱离本发明的范围。第一触发信号和第二触发信号是两个触发信号,但是它们不是相同的接触。还应当理解的是,在本文中使用的,除非上下文清楚地支持例外情况,单数形式“一个”(“a”、“an”、和“the”)旨在也包括复数形式。还应该理解的是,在本文中使用的“和/或”是指包括一个或者一个以上相关联地列出的项目的任意和所有可能组合。
上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。
本领域普通技术人员可以理解实现上述实施例的全部或部分步骤可以通过硬件来完成,也可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读存储介质中,上述提到的存储介质可以是只读存储器,磁盘或光盘等。
以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
图1
图2
图3
图4
图5