一种面向资源受限移动设备的实时软阴影生成方法及装置与流程

文档序号:16903538发布日期:2019-02-19 18:12阅读:167来源:国知局
一种面向资源受限移动设备的实时软阴影生成方法及装置与流程

本发明属于三维图形绘制技术领域,尤其涉及一种三维场景的实时软阴影生成方法及装置,用于解决现有软阴影生成方法在资源受限移动设备上的软阴影生成质量问题。



背景技术:

阴影是计算机图形学领域尤其是三维图形绘制技术中的一个很重要的内容。逼真的阴影效果能使三维场景更加富有真实感,并且有助于人们直观地理解三维场景中各物体的相对位置关系。因此,阴影生成技术在虚拟现实和三维动画及影视游戏等领域中有着广泛而重要的应用。

在现实世界,光线被物体遮挡而产生阴影。而在三维图形绘制领域,需要通过模拟该光学原理来生成三维场景中的阴影。根据保存阴影信息的数据结构的不同,可以分为阴影图和阴影体。阴影图由于仅需要保存一张二维图像,可以充分发挥gpu可编程图形绘制能力,因此具有较高的执行效率。根据阴影边界的效果,可以将阴影分为硬阴影和软阴影。硬阴影虽然实现方法简单,但在无阴影区域和完全阴影区域之间的边界会呈现严重的“锯齿”走样现象,影响三维场景的真实感。软阴影则在无阴影区域和完全阴影区域之间增加了过渡的软阴影区域,能更加逼真地模拟现实世界中的阴影效果。当前许多实时软阴影生成方法都是面向个人电脑的高性能gpu而设计的,具有效高的软阴影生成质量(请参见文献:hoshangkolivand,mohdshahrizalsunar.anti-aliasinginimagebasedshadowgenerationtechniques:acomprehensivesurvey[j].multimediatoolsandapplications,2015,74(18):7461-7487)。但是,由于资源受限的移动设备对gpu可编程的能力较低并且对显存数据格式的支持有限,很多手机和平板电脑的gpu仅能支持opengles2.0版本,面向个人电脑的实时软阴影生成方法并不能很好地支持这些资源受限的移动设备。

故,针对现有技术的缺陷,实有必要提出一种技术方案以解决现有技术存在的技术问题。



技术实现要素:

本发明的目的在于针对现有技术的不足,提供一种面向资源受限移动设备的实时软阴影生成方法及装置,能有效地提高在资源受限移动设备上的三维场景软阴影生成质量。

为了解决现有技术存在的技术问题,本发明的技术方案如下:

一种面向资源受限移动设备的实时软阴影生成方法,所述方法包括:

步骤s1、在移动设备中配置三维场景及其所需要的各项输入信息,并创建阴影图和深度纹理,其中,所述阴影图为包含rgba四个8位浮点数颜色分量的二维阴影图,所述深度纹理为与该阴影图分辨率相同的二维深度纹理;

步骤s2、对步骤s1创建的阴影图和深度纹理进行像素初始化;

步骤s3、采用第一gpu可编程绘制流水线绘制三维场景中的所有三维模型,将编码后的离光源最近的三维模型表面的深度信息保存到阴影图中;

步骤s4、根据步骤s3获取的深度信息,采用第二gpu可编程绘制流水线对其进行高斯模糊滤波操作,将编码后的模糊深度信息更新到阴影图中,得到模糊后的阴影图;

步骤s5、采用第三gpu可编程绘制流水线绘制三维场景中的所有三维模型,将模糊后的阴影图中所包含的软阴影信息绘制到显示窗口,使绘制的三维场景呈现逼真的软阴影效果。

作为优选的技术方案,在所述步骤s1中,输入信息至少包括三维场景的观察点的位置和观察方向、显示窗口的颜色缓冲和深度缓冲、显示窗口的分辨率、光源的位置和光源的光照方向、光源视域深度最小值和光源视域深度最大值、三维场景中所有三维模型的摆放位置以及阴影图的分辨率。

作为优选的技术方案,所述步骤s3进一步包括以下步骤:

步骤s31、以阴影图为颜色绘制缓冲,以深度纹理为深度绘制缓冲;以步骤s1给定的光源的位置作为第一gpu绘制流水线的摄像机观察点,以步骤s1给定的光源的光照方向为摄像机观察方向确定视域变换矩阵,三维场景中的每个三维模型根据步骤s1给定的摆放位置确定各自的世界坐标变换矩阵;

步骤s32、在第一gpu可编程绘制流水线的gpu顶点着色器中,对三维模型的当前顶点坐标(记为p1)进行处理并获得视域坐标系下的四维齐次坐标(记为p3)作为gpu顶点着色器顶点坐标的输出;

步骤s33、在第一gpu可编程绘制流水线的gpu像素着色器中,对阴影图的像素颜色进行处理以获得编码后的四维深度信息d2作为gpu像素着色器的颜色输出;其中,对阴影图的像素颜色进行处理进一步包括以下步骤:

根据步骤s32中所述的视域坐标系下的四维齐次坐标p3,将像素深度信息p3.w归一化到0~1之间,获得归一化后的深度信息d1;

将归一化后的深度信息d1进行编码转换获得编码后的四维深度信息d2,编码转换计算公式为:

x1=fraction(d1);

x2=fraction(d1*255);

x3=fraction(d1*255*255);

x4=fraction(d1*255*255*255);

d2.r=x1-x2/255;d2.g=x2-x3/255;d2.b=x3-x4/255;d2.a=x4;

式中,函数fraction表示去掉浮点数的整数部分后获得小数部分的数值,d2为四维颜色向量,d2.r、d2.g、d2.b、d2.a分别表示d2的r(红)、g(绿)、b(蓝)、a(透明度)四个颜色分量的颜色值。

作为优选的技术方案,步骤s32进一步包括以下步骤:

步骤s321:计算p1的初始四维齐次坐标(记为p2):

p2.x=p1.x;p2.y=p1.y;p2.z=p1.z;p2.w=1;其中,p1.x、p1.y、p1.z分别表示p1的x轴、y轴、z轴的坐标值;p2.x、p2.y、p2.z、p2.w分别表示p2的x轴、y轴、z轴、w轴的坐标值;

步骤s322:根据步骤s31的三维模型的世界坐标变换矩阵和视域变换矩阵,对初始四维齐次坐标p2进行坐标变换,获得视域坐标系下的四维齐次坐标p3,坐标变换计算公式为:

p3=v*w*p2,其中v为视域变换矩阵,w为世界坐标变换矩阵。

作为优选的技术方案,步骤s33中将像素深度信息进行归一化的步骤进一步包括:

根据步骤s1给定的光源视域深度最小值(记为d_min)和光源视域深度最大值(记为d_max)、步骤s32中所计算的视域坐标系下的四维齐次坐标p3,将像素深度信息p3.w归一化到0~1之间获得归一化后的深度信息d1,计算公式为:d1=(p3.w-d_min)/(d_max-d_min)。

作为优选的技术方案,所述步骤s4进一步包括以下步骤:

步骤s41、创建一张包含rgba四个8位浮点数颜色分量的二维临时纹理,临时纹理分辨率大小与阴影图相同;并以临时纹理为颜色绘制缓冲,以阴影图作为输入纹理;

步骤s42、在第二gpu可编程绘制流水线的gpu顶点着色器中,输出阴影图的四个顶点坐标以及同时输出其纹理坐标;

步骤s43、在第二gpu可编程绘制流水线的gpu像素着色器中,根据当前像素的纹理坐标,从阴影图中读取当前像素周围邻域的编码后的四维深度信息d2并对其进行解码转换得到归一化后的深度信息d1,其中解码转换计算公式为:

d1=d2.r+d2.g/255+d2.b/(255*255)+d2.a/(255*255*255);

对当前像素周围邻域的归一化后的深度信息执行高斯模糊操作得到当前像素的模糊深度信息,然后对模糊深度信息再次采用步骤s33中所述的编码转换,得到编码后的模糊深度信息(记为d3)作为gpu像素着色器的颜色输出;

步骤s44、将步骤s43所计算的临时纹理中的编码后的模糊深度信息更新到阴影图中,得到模糊后的阴影图。

作为优选的技术方案,所述步骤s5进一步包括以下步骤:

步骤s51、以步骤s1给定的显示窗口的颜色缓冲为颜色绘制缓冲,以显示窗口的深度缓冲为深度绘制缓冲,以模糊后的阴影图作为输入纹理,以三维场景的观察点作为第三gpu绘制流水线的摄像机观察点,以三维场景的观察方向为摄像机观察方向确定观察点视域变换矩阵,三维场景中的每个三维模型根据步骤s1给定的摆放位置确定各自的世界坐标变换矩阵,将绘制窗口大小设置为显示窗口的分辨率大小;

步骤s52、在第三gpu可编程绘制流水线的gpu顶点着色器中,根据步骤s51中所述的摄像机观察点、观察点视域变换矩阵、世界坐标变换矩阵,获得三维场景的观察点视域坐标系下的四维齐次坐标,作为gpu顶点着色器的顶点坐标输出;根据步骤s1给定的光源的位置和光照方向,获得方法计算光源视域坐标系下的四维齐次坐标,作为gpu顶点着色器的阴影坐标输出;

步骤s53、在第三gpu可编程绘制流水线的gpu像素着色器中,将步骤s52中所述的光源视域坐标系下的四维齐次坐标进行归一化操作获得当前像素在光源视域坐标系下的归一化后的深度信息(记为d);从模糊后的阴影图中分别读取当前像素、水平方向右方邻居像素、垂直方向下方邻居像素的编码后的模糊深度信息,根据步骤s43所述的解码转换方法获得这3个像素的解码后的模糊深度信息(分别记为ref、rx、ry);计算出当前像素的阴影值(记为s)作为第三gpu可编程绘制流水线的gpu像素着色器中的软阴影,计算公式为:

var=max(0.000001,0.25*((rx-ref)*(rx-ref)+(ry-ref)*(ry-ref)));

s=max(0,min(1,var/(var+(d-ref)*(d-ref))));

式中,max和min分别表示取最大值和取最小值的函数。

作为优选的技术方案,所述步骤s2进一步包括:

将阴影图中所有像素的rgba四个8位浮点数颜色分量都初始化为1,并将深度作为优选的技术方案,移动设备为智能手机、平板电脑或专用手持终端。

本发明还公开了一种面向资源受限移动设备的实时软阴影生成装置,所述装置包括:

配置单元,用于在移动设备中配置三维场景及其所需要的各项输入信息;

创建单元,用于创建阴影图和深度纹理,其中,所述阴影图为包含rgba四个8位浮点数颜色分量的二维阴影图,所述深度纹理为与该阴影图分辨率相同的二维深度纹理;

初始化单元,用于对创建的阴影图和深度纹理进行像素初始化;

第一gpu可编程绘制流水线,用于绘制三维场景中的所有三维模型并将编码后的离光源最近的三维模型表面的深度信息保存到阴影图中;

第二gpu可编程绘制流水线,用于根据所获取的深度信息并对其进行高斯模糊滤波操作,以及将编码后的模糊深度信息更新到阴影图中进而得到模糊后的阴影图;

第三gpu可编程绘制流水线,用于绘制三维场景中的所有三维模型并将模糊后的阴影图中所包含的软阴影信息绘制到显示窗口以使绘制的三维场景呈现逼真的软阴影效果。

为现有技术相比,本发明具有如下有益效果:

本发明所提出的一种面向资源受限移动设备的实时软阴影生成方法及装置,通过将深度信息保存为基于rgba四个8位浮点数的数据格式中,从而有效地支持了资源受限的移动设备的显存数据格式;同时通过编码转换和解码转换方法支持了移动设备中深度信息的正确计算和处理,不仅能使所绘制的三维场景呈现逼真的软阴影效果,还有效地提高了三维场景软阴影的实时生成效率。

附图说明

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,根据这些附图获得其他的附图仍属于本发明的范畴。

图1为本发明实施例提供的一种面向资源受限移动设备的实时软阴影生成方法的流程图。

图2为本发明实施例提供的一种面向资源受限移动设备的实时软阴影生成装置的结构框图。

具体实施方式

为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。

如图1所示,为本发明实施例中,提出的一种面向资源受限移动设备的实时软阴影生成方法,所述方法包括:

步骤s1、给定本发明所需要的各项输入,创建阴影图和深度纹理。给定三维场景的观察点的位置和观察方向,给定显示窗口的颜色缓冲和深度缓冲,给定显示窗口的分辨率。给定光源的位置和光源的光照方向,给定光源视域深度最小值和光源视域深度最大值,给定三维场景中所有三维模型的摆放位置,给定阴影图的分辨率。创建一张包含rgba四个8位浮点数颜色分量的二维阴影图和一张相同分辨率的二维深度纹理。将绘制窗口大小设置为阴影图的分辨率大小。

步骤s2、根据步骤s1给定的阴影图和深度纹理,将阴影图中所有像素的rgba四个8位浮点数颜色分量都初始化为1,并将深度纹理中所有像素的深度值初始化为1。

步骤s3、根据步骤s1给定的阴影图和深度纹理,采用第一gpu可编程绘制流水线绘制三维场景中的所有三维模型,将编码后的离光源最近的三维模型表面的深度信息保存到阴影图中。

所述步骤s3具体包括:

步骤s31、根据步骤s1所述的阴影图和深度纹理,以阴影图为颜色绘制缓冲,以深度纹理为深度绘制缓冲。以步骤s1给定的光源的位置作为第一gpu绘制流水线的摄像机观察点,以步骤s1给定的光源的光照方向为摄像机观察方向确定视域变换矩阵(记为v),三维场景中的每个三维模型根据步骤s1给定的摆放位置确定各自的世界坐标变换矩阵(记为w)。

步骤s32、在第一gpu可编程绘制流水线的gpu顶点着色器中,对三维模型的当前顶点坐标(记为p1)进行处理。由于三维模型的顶点坐标是一个三维向量,因此可以记p1.x、p1.y、p1.z分别表示p1的x轴、y轴、z轴的坐标值。计算p1的初始四维齐次坐标(记为p2):

p2.x=p1.x;p2.y=p1.y;p2.z=p1.z;p2.w=1。

式中,由于四维齐次坐标是一个四维向量,因此可以记p2.x、p2.y、p2.z、p2.w分别表示p2的x轴、y轴、z轴、w轴的坐标值。

根据步骤s31的三维模型的世界坐标变换矩阵w、视域变换矩阵v,对初始四维齐次坐标p2进行坐标变换,获得视域坐标系下的四维齐次坐标(记为p3)作为gpu顶点着色器顶点坐标的输出,计算公式为:

p3=v*w*p2

步骤s33、在第一gpu可编程绘制流水线的gpu像素着色器中,对阴影图的像素颜色进行处理。首先,根据步骤s1给定的光源视域深度最小值(记为d_min)和光源视域深度最大值(记为d_max)、步骤s32中所计算的视域坐标系下的四维齐次坐标p3,将像素深度信息p3.w归一化到0~1之间,获得归一化后的深度信息d1,计算公式为:

d1=(p3.w-d_min)/(d_max-d_min)

式中,由于四维齐次坐标是一个四维向量,因此可以记p3.x、p3.y、p3.z、p3.w分别表示p3的x轴、y轴、z轴、w轴的坐标值。

由于资源受限的移动设备对gpu可编程的能力较低并且对显存数据格式的支持有限,所以gpu像素着色器不支持32位浮点数格式的颜色输出,而只支持rgba四个8位浮点数格式的颜色输出。因此,将归一化后的深度信息d1进行编码转换,获得编码后的四维深度信息d2,计算公式为:

x1=fraction(d1);

x2=fraction(d1*255);

x3=fraction(d1*255*255);

x4=fraction(d1*255*255*255);

d2.r=x1-x2/255;d2.g=x2-x3/255;d2.b=x3-x4/255;d2.a=x4。

式中,函数fraction表示去掉浮点数的整数部分后获得小数部分的数值,由于四维深度信息d2是一个四维颜色向量,因此可以记d2.r、d2.g、d2.b、d2.a分别表示d2的r(红)、g(绿)、b(蓝)、a(透明度)四个颜色分量的颜色值。因此,编码后的四维深度信息d2作为gpu像素着色器的颜色输出。至此,根据步骤s31中所述的以阴影图为颜色绘制缓冲,阴影图中所有像素的rgba四个8位浮点数颜色分量保存着编码后的四维深度信息d2,即编码后的离光源最近的三维模型表面的深度信息。

步骤s4、根据步骤s3所计算的编码后的离光源最近的三维模型表面的深度信息,采用第二gpu可编程绘制流水线对其进行高斯模糊滤波操作,将编码后的模糊深度信息更新到阴影图中,得到模糊后的阴影图。

所述步骤s4具体包括:

步骤s41、创建一张包含rgba四个8位浮点数颜色分量的二维临时纹理,临时纹理分辨率大小与阴影图相同。以临时纹理为颜色绘制缓冲,以阴影图作为输入纹理。

步骤s42、在第二gpu可编程绘制流水线的gpu顶点着色器中,输出阴影图的四个顶点坐标,即(-1,-1)、(-1,1)、(1,-1)、(1,1)同时输出其纹理坐标,即(0,0)、(0,1)、(1,0)、(1,1),从而保证对阴影图的正确读取。

步骤s43、在第二gpu可编程绘制流水线的gpu像素着色器中,根据当前像素的纹理坐标,从阴影图中读取当前像素周围邻域的编码后的四维深度信息。对于所读取的编码后的四维深度信息d2,先进行解码转换,得到步骤s33中所述的归一化后的深度信息d1。因为编码转换和解码转换是一个可逆的过程,所以解码转换的计算公式为步骤s33中所述的编码转换的计算公式的逆过程,具体计算公式为:

d1=d2.r+d2.g/255+d2.b/(255*255)+d2.a/(255*255*255)。

对当前像素周围邻域的归一化后的深度信息执行高斯模糊操作得到当前像素的模糊深度信息,然后对模糊深度信息再次采用步骤s33中所述的编码转换,得到编码后的模糊深度信息(记为d3)作为gpu像素着色器的颜色输出。至此,根据步骤s41中所述的以临时纹理为颜色绘制缓冲,临时纹理中所有像素的rgba四个8位浮点数颜色分量保存着编码后的模糊深度信息d3。

步骤s44、将步骤s43所计算的临时纹理中的编码后的模糊深度信息更新到阴影图中,得到模糊后的阴影图。

步骤s5、采用第三gpu可编程绘制流水线绘制三维场景中的所有三维模型,将模糊后的阴影图中所包含的软阴影信息绘制到显示窗口,使绘制的三维场景呈现逼真的软阴影效果。

所述步骤s5具体包括:

步骤s51、以步骤s1给定的显示窗口的颜色缓冲为颜色绘制缓冲,以显示窗口的深度缓冲为深度绘制缓冲,以模糊后的阴影图作为输入纹理,以三维场景的观察点作为第三gpu绘制流水线的摄像机观察点,以三维场景的观察方向为摄像机观察方向确定观察点视域变换矩阵,三维场景中的每个三维模型根据步骤s1给定的摆放位置确定各自的世界坐标变换矩阵。将绘制窗口大小设置为显示窗口的分辨率大小。

步骤s52、在第三gpu可编程绘制流水线的gpu顶点着色器中,根据步骤s51中所述的摄像机观察点、观察点视域变换矩阵、世界坐标变换矩阵,根据步骤s32的计算方法计算三维场景的观察点视域坐标系下的四维齐次坐标,作为gpu顶点着色器的顶点坐标输出;根据步骤s1给定的光源的位置和光照方向,根据步骤s32的计算方法计算光源视域坐标系下的四维齐次坐标,作为gpu顶点着色器的阴影坐标输出。

步骤s53、在第三gpu可编程绘制流水线的gpu像素着色器中,根据步骤s52中所计算的光源视域坐标系下的四维齐次坐标,根据步骤s33所述的归一化方法获得当前像素在光源视域坐标系下的归一化后的深度信息(记为d);从模糊后的阴影图中分别读取当前像素、水平方向右方邻居像素、垂直方向下方邻居像素的编码后的模糊深度信息,由于模糊后的阴影图中保存的数据都是编码转换后的数据,因此根据步骤s43所述的解码转换方法获得这3个像素的解码后的模糊深度信息(分别记为ref、rx、ry);计算出当前像素的阴影值(记为s),计算公式为:

var=max(0.000001,0.25*((rx-ref)*(rx-ref)+(ry-ref)*(ry-ref)));

s=max(0,min(1,var/(var+(d-ref)*(d-ref))));

式中,max和min分别表示取最大值和取最小值的函数。根据该计算公式,阴影值s的取值范围为0~1之间,s值在光源完全照到的区域的取值为s=1,因此s=1表示无阴影区域;s值在光源完全照不到的区域的取值为s=0,因此取值s=0表示完全阴影区域;s值在前述两个区域之间的取值为0<s<1,因此取值0<s<1表示软阴影区域。至此,得到的阴影值s即为所求的第三gpu可编程绘制流水线的gpu像素着色器中的软阴影。

参见图2,所示为本发明一种面向资源受限移动设备的实时软阴影生成装置的结构框图,具体包括:

配置单元,用于在移动设备中配置三维场景及其所需要的各项输入信息;

创建单元,用于创建阴影图和深度纹理,其中,所述阴影图为包含rgba四个8位浮点数颜色分量的二维阴影图,所述深度纹理为与该阴影图分辨率相同的二维深度纹理;

初始化单元,用于对创建的阴影图和深度纹理进行像素初始化;

第一gpu可编程绘制流水线,用于绘制三维场景中的所有三维模型并将编码后的离光源最近的三维模型表面的深度信息保存到阴影图中;

第二gpu可编程绘制流水线,用于根据所获取的深度信息并对其进行高斯模糊滤波操作,以及将编码后的模糊深度信息更新到阴影图中进而得到模糊后的阴影图;

第三gpu可编程绘制流水线,用于绘制三维场景中的所有三维模型并将模糊后的阴影图中所包含的软阴影信息绘制到显示窗口以使绘制的三维场景呈现逼真的软阴影效果。

在本发明面向资源受限移动设备的实时软阴影生成装置中执行上述面向资源受限移动设备的实时软阴影生成方法的流程步骤。

本领域普通技术人员可以理解实现上述实施例方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,所述的程序可以存储于一计算机可读取存储介质中,所述的存储介质,如rom/ram、磁盘、光盘等。

以上实施例的说明只是用于帮助理解本发明的方法及其核心思想。应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以对本发明进行若干改进和修饰,这些改进和修饰也落入本发明权利要求的保护范围内。

对所公开的实施例的上述说明,使本领域专业技术人员能够实现或使用本发明。对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本发明的精神或范围的情况下,在其它实施例中实现。因此,本发明将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。

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