本申请实施例涉及模型渲染领域,特别涉及一种在虚拟模型上贴花的方法、装置、设备及介质。
背景技术:
贴花(decals)是游戏引擎当中常用的一类贴图技术,通常是把图片绘制到另一个物体的表面,游戏中常见的污迹、弹孔、脚印、墙面涂鸦、技能圈、人物选中圈等等都归功于贴花效果。
相关技术中,游戏引擎会对需要投影贴花的虚拟模型使用投影材质重新渲染一遍,即,获取虚拟模型被投影部分的网格;投影材质会在着色器中根据投影仪传入的投影矩阵计算对贴花进行采样的uv值,根据uv值在网格上进行贴花的绘制。
然而,一个贴花可能会投影到多个虚拟模型上,还可能会投影到一个虚拟模型的不同材质部位上,由于不同虚拟模型的网格互相独立,同一个虚拟模型不同材质部位的网格互相独立,当一个贴花投影到多个虚拟模型或一个虚拟模型的不同材质部位上时,游戏引擎需要多个drawcall分别绘制各个网格,渲染性能较差。
其中,drawcall为cpu(centralprocessingunit,中央处理器)调用图形编程接口,减少drawcall是提升游戏渲染性能的主要手段之一。
技术实现要素:
本申请实施例提供了一种在虚拟模型上贴花的方法、装置、设备及介质,能够减少在虚拟模型上贴花所需的drawcall,提高游戏渲染性能。所述技术方案如下:
一方面,提供了一种在虚拟模型上贴花的方法,所述方法包括:
渲染所述虚拟模型,得到所述虚拟模型的模型片元;
在贴花片上渲染所述贴花,得到所述贴花片的贴花片元,所述贴花片位于摄像机模型与所述虚拟模型之间,所述摄像机模型用于透过所述贴花片观察所述虚拟模型得到观察画面;
在所述模型片元上叠加所述贴花片元生成所述观察画面,所述观察画面上显示有贴有所述贴花的所述虚拟模型。
另一方面,提供了一种在虚拟模型上贴花的装置,所述装置包括:
贴花渲染模块,用于在贴花片上渲染所述贴花,得到所述贴花片的贴花片元,所述贴花片位于摄像机模型与所述虚拟模型之间,所述摄像机模型用于透过所述贴花片观察所述虚拟模型得到观察画面;
生成模块,用于在所述模型片元上叠加所述贴花片元生成所述观察画面,所述观察画面上显示有贴有所述贴花的所述虚拟模型。
另一方面,提供了一种计算机设备,所述计算机设备包括处理器和存储器,所述存储器中存储有至少一段程序,所述至少一段程序由所述处理器加载并执行以实现如上述本申请实施例中任一所述的在虚拟模型上贴花的方法。
另一方面,提供了一种计算机可读存储介质,所述存储介质中存储有至少一条指令、至少一段程序、代码集或指令集,所述至少一条指令、所述至少一段程序、所述代码集或指令集由处理器加载并执行以实现如上述本申请实施例中任一所述的在虚拟模型上贴花的方法。
另一方面,提供了一种计算机程序产品或计算机程序,该计算机程序产品或计算机程序包括计算机指令,该计算机指令存储在计算机可读存储介质中。计算机设备的处理器从计算机可读存储介质读取该计算机指令,处理器执行该计算机指令,使得该计算机设备执行上述实施例中任一所述的在虚拟模型上贴花的方法。
本申请实施例提供的技术方案带来的有益效果至少包括:
通过在摄像机模型与虚拟模型之间设置贴花片,在贴花片上渲染贴花,使摄像机模型透过贴花观察虚拟模型,进而使摄像机模型生成的观察画面中在虚拟模型上贴有贴花。在渲染过程中,计算机设备先渲染虚拟模型得到模型片元,再渲染贴花得到贴花片元,然后在模型片元上叠加贴花片元,即可实现在模型上贴上贴花的效果。由于贴花片是一个单独的模型,仅具有一个网格,因此,在贴花片上渲染贴花仅需进行一次drawcall,相比于相关技术中的方法,大大降低了在虚拟模型上渲染一个贴花所需的drawcall数量,提高了游戏渲染的性能。
附图说明
为了更清楚地说明本申请实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本申请一个示例性实施例提供的各个空间坐标系的转换示意图;
图2是本申请另一个示例性实施例提供的渲染过程示意图;
图3是本申请另一个示例性实施例提供的在虚拟模型上贴花的方法的实施环境示意图;
图4是本申请另一个示例性实施例提供的在虚拟模型上贴花的方法的流程图;
图5是本申请另一个示例性实施例提供的在虚拟模型上贴花的方法的流程图;
图6是本申请另一个示例性实施例提供的在虚拟模型上贴花的方法的贴花示意图;
图7是本申请另一个示例性实施例提供的在虚拟模型上贴花的方法的贴花示意图;
图8是本申请另一个示例性实施例提供的在虚拟模型上贴花的方法的贴花示意图;
图9是本申请另一个示例性实施例提供的在虚拟模型上贴花的方法的贴花示意图;
图10是本申请另一个示例性实施例提供的在虚拟模型上贴花的方法的贴花示意图;
图11是本申请另一个示例性实施例提供的在虚拟模型上贴花的方法的贴花示意图;
图12是本申请另一个示例性实施例提供的在虚拟模型上贴花的方法的贴花示意图;
图13是本申请另一个示例性实施例提供的在虚拟模型上贴花的方法的溶解贴图的示意图;
图14是本申请另一个示例性实施例提供的在虚拟模型上贴花的方法的流程图;
图15是本申请另一个示例性实施例提供的在虚拟模型上贴花的方法的流程图;
图16是本申请另一个示例性实施例提供的在虚拟模型上贴花的方法的界面示意图;
图17是本申请另一个示例性实施例提供的在虚拟模型上贴花的方法的界面示意图;
图18是本申请另一个示例性实施例提供的在虚拟模型上贴花的方法的界面示意图;
图19是本申请另一个示例性实施例提供的在虚拟模型上贴花的方法的界面示意图;
图20是本申请另一个示例性实施例提供的在虚拟模型上贴花的方法的界面示意图;
图21是本申请另一个示例性实施例提供的在虚拟模型上贴花的方法的贴花示意图;
图22是本申请另一个示例性实施例提供的在虚拟模型上贴花的方法的界面示意图;
图23是本申请另一个示例性实施例提供的在虚拟模型上贴花的方法的贴花示意图;
图24是本申请另一个示例性实施例提供的在虚拟模型上贴花的方法的贴花示意图;
图25是本申请另一个示例性实施例提供的在虚拟模型上贴花的装置的结构框图;
图26是本申请另一个示例性实施例提供的计算机设备的结构示意图。
具体实施方式
为使本申请的目的、技术方案和优点更加清楚,下面将结合附图对本申请实施方式作进一步地详细描述。
首先,针对本申请实施例中涉及的名词进行简单介绍:
虚拟环境:是应用程序在终端上运行时显示(或提供)的虚拟环境。该虚拟环境可以是对真实世界的仿真环境,也可以是半仿真半虚构的环境,还可以是纯虚构的环境。虚拟环境可以是二维虚拟环境、2.5维虚拟环境和三维虚拟环境中的任意一种,本申请对此不加以限定。下述实施例以虚拟环境是三维虚拟环境来举例说明。
虚拟对象:是指虚拟环境中的可活动对象。该可活动对象可以是虚拟人物、虚拟动物、动漫人物等,比如:在三维虚拟环境中显示的人物、动物、植物、油桶、墙壁、石块等。可选地,虚拟对象是基于动画骨骼技术创建的三维立体模型。每个虚拟对象在三维虚拟环境中具有自身的形状和体积,占据三维虚拟环境中的一部分空间。
虚拟模型:是指通过网格衔接的方式搭建得到的三维模型,可选地,该三维模型可以是通过三角形网格搭建得到的模型,也可以是通过四边形网格搭建得到的模型,还可以是通过其他多边形网格搭建得到的模型,本申请实施例对此不加以限定。可选地,本申请实施例中,虚拟模型可以是指虚拟环境/虚拟场景的三维模型,也可以是指位于虚拟环境/虚拟场景中的虚拟对象的三维模型。
贴花:是指需要被投射到虚拟模型上的材质,在游戏中常用来实现污迹、弹孔、脚印、墙面涂鸦、技能圈、人物选中圈。
在将虚拟模型渲染至显示屏上的过程中,虚拟模型的坐标会被变换到多个空间坐标系。将虚拟模型的坐标变换到几个过渡坐标系(intermediatecoordinatesystem)的优点在于,在这些特定的空间坐标系中,一些操作或运算更加方便和容易。比较重要的空间坐标系共有五个,分别为:
局部空间(localspace,或者称为物体空间(objectspace));
世界空间(worldspace);
观察空间(viewspace,或者称为视觉空间(eyespace));
裁剪空间(clipspace);
屏幕空间(screenspace)。
其中,请参考图1,其示出了本申请一个示例性实施例提供的各个空间坐标系的转换示意图,如图1所示,在局部空间1010内,是以虚拟模型1000的中心为原点建立物体坐标系的空间,也可以称为物体空间;通过世界矩阵1011转换后,将虚拟模型1000映射至世界空间1020内,世界空间1020是以虚拟环境中的指定位置为全局原点建立世界坐标系得到的空间,相对于全局原点确定虚拟模型在世界空间中的位置;通过观察矩阵1021转换后,将虚拟模型1000映射至观察空间1030内,观察空间1030是以摄像机模型的视角对虚拟环境进行观察时的空间,观察空间1030中以摄像机模型的位置为原点建立有观察坐标系。由于摄像机模型的视野范围有限,故还需要对观察空间1030通过裁减矩阵1031进行裁剪和映射,得到裁剪空间1040,裁剪空间1040是在观察空间1030的基础上根据摄像机模型的视锥体裁剪得到的;最后,通过视口变换(viewporttransform)从裁剪空间1040这种的裁剪坐标变换为屏幕坐标,也即,将裁剪空间1040中的虚拟模型1000映射至屏幕空间1050,以实现在屏幕中的对应位置进行显示。
其中,将顶点变换到各个不同的空间坐标系,是由于存在一些操作在特定的坐标系统中才有意义且处理较为方便。如,当需要对物体本身进行修改的时候,在局部空间中操作会更方便;如果要对一个物体做出一个相对于其它物体位置的操作(如:位置移动)时,在世界坐标系中更方便。
在游戏引擎中,虚拟模型都在三维空间中,而屏幕和窗口却是二维像素数组,这导致游戏引擎的大部分工作都是关于把三维坐标转变为适应屏幕的二维像素。三维坐标转为二维坐标的处理过程是由游戏引擎的图形渲染管线(graphicspipeline,大多译为管线,实际上指的是一堆原始图形数据途经一个输送管道,期间经过各种变化处理最终出现在屏幕的过程)管理的。图形渲染管线可以被划分为两个主要部分:第一部分把虚拟模型的三维坐标转换为二维坐标,第二部分是把二维坐标转变为实际的有颜色的像素。
图形渲染管线接收一组三维坐标,然后把它们转变为屏幕上的有色二维像素输出。图形渲染管线可以被划分为几个阶段,每个阶段将会把前一个阶段的输出作为输入。所有这些阶段都是高度专门化的(它们都有一个特定的函数),并且很容易并行执行。正是由于它们具有并行执行的特性,当今大多数显卡都有成千上万的小处理核心,它们在gpu上为每一个(渲染管线)阶段运行各自的小程序,从而在图形渲染管线中快速处理的数据。这些小程序叫做着色器(shader)。
如图2所示,示出了图形渲染管线渲染虚拟模型得到像素点的流程图。首先,顶点着色器(vertexshader)201获取虚拟模型的顶点信息,绘制虚拟模型的顶点,然后进行形状(图元)装配(primitiveassembly)202,图元装配(primitiveassembly)阶段将顶点着色器输出的所有顶点作为输入,并所有的点装配成指定图元的形状;图2中例子中是一个三角形。图元装配的输出会被传入光栅化阶段(rasterizationstage)203,这里它会把图元映射为最终屏幕上相应的像素,生成供片段着色器(fragmentshader)204使用的片元(fragment)。片段着色器204的主要目的是计算一个片元的最终颜色。通常,片段着色器包含三维场景的数据(比如光照、阴影、光的颜色等等),这些数据可以被用来计算最终片元的颜色。在所有片元对应颜色值确定以后,片元将会被传到最后一个阶段,测试和混合(blending)阶段205(也可以称为测试与融合)。这个阶段检测片元的对应的深度(和模板(stencil))值),用它们来判断这个片元位于其它片元的前面还是后面,决定是否应该丢弃。这个阶段也会检查alpha值(alpha值定义了一个物体的透明度)并对片元进行混合(blend)。所以,即使在片段着色器中计算出来了一个片元输出的颜色,经过测试与混合之后该片元对应位置最终输出的像素点的颜色也可能会完全不同。
需要说明的是,当游戏引擎渲染一个虚拟场景时,对于虚拟场景中的每个模型(例如,一片平地的模型、一棵树的模型、一辆车的模型)都会调用其对应的着色器进行渲染,分别得到对应的片元,例如,调用平地着色器渲染平地得到平地片元,调用树着色器渲染树得到树片元,调用车着色器对车进行渲染得到车片元,在最后的测试与混合阶段,会测试当前新生成的片元与之前渲染得到的各个片元之间的深度关系,例如,当车位于树的前方时,车会挡住树的部分片元,则根据之前渲染得到的车片元的深度信息,会在测试与混合阶段将树片元中被遮挡的部分片元去除。
本申请实施例提供的在虚拟模型上贴花的方法,可以由终端执行实现,也可以由终端和服务器配合执行实现。本实施例中,以终端执行虚拟物体的渲染方法为例进行说明。
图3是本申请一个示例性实施例提供的在虚拟模型上贴花的方法的实施环境示意图,如图3所示,该实施环境中包括:终端310和服务器320,其中,终端310与服务器320之间通过通信网络330连接。
终端310中安装有渲染虚拟模型的应用程序,用户在终端310中使用渲染虚拟模型的应用程序,如:用户通过终端310控制虚拟角色在虚拟环境中运动。其中,虚拟环境/虚拟场景包括虚拟地形、虚拟植被、虚拟云朵、虚拟石头等的虚拟模型。虚拟环境/虚拟场景中还包括虚拟对象,虚拟对象包括可以在虚拟环境中活动的虚拟角色、虚拟动物、虚拟载具等的虚拟模型。示例性的,可以采用本申请提供的方法在这些虚拟模型上渲染贴花,例如,以虚拟角色所在位置为中心,在虚拟地面上渲染虚拟角色的角色选中圈,角色选中圈用于标识当前被选中的虚拟角色。
在一些实施例中,终端310基于与服务器320之间的数据交互,实现贴花渲染,例如,终端310从服务器320获取贴花的投影信息,例如,投影信息包括投影方式、投影位置和投影范围中的至少一种,然后终端根据投影信息渲染贴花。或,服务器320根据贴花的投影信息渲染贴花,将渲染结果发送给终端310,终端显示渲染结果。
值得注意的是,上述服务器可以是独立的物理服务器,也可以是多个物理服务器构成的服务器集群或者分布式系统,还可以是提供云服务、云数据库、云计算、云函数、云存储、网络服务、云通信、中间件服务、域名服务、安全服务、内容分发网络(contentdeliverynetwork,cdn)、以及大数据和人工智能平台等基础云计算服务的云服务器。
终端可以是智能手机、平板电脑、笔记本电脑、台式计算机、智能音箱、智能手表等,但并不局限于此。终端以及服务器可以通过有线或无线通信方式进行直接或间接地连接,本申请在此不做限制。
结合上述名词简介和实施环境,对本申请实施例提供的在虚拟模型上贴花的方法进行说明。
图4示出了本申请一个示例性实施例提供的图像处理方法的流程图。该方法可以由计算机设备来执行,例如,如图3所示的终端或服务器来执行。该方法包括如下步骤。
步骤410,渲染虚拟模型,得到虚拟模型的模型片元。
虚拟模型可以是虚拟场景的模型,或,虚拟场景中虚拟对象的模型。步骤410中的虚拟模型的数量为至少一个。该虚拟模型包括要被投影提花示例性的,多个虚拟模型可以组成虚拟场景/虚拟环境,则步骤410可以替换为:渲染虚拟场景,得到虚拟场景的模型片元(场景片元)。
示例性的,当步骤410中的虚拟模型指代的是由多个虚拟模型组成的虚拟场景模型时,计算机设备会分别对每个虚拟模型进行渲染得到每个虚拟模型的模型片元,然后将每个模型的模型片元经过测试和融合得到最终的场景片元。即,当虚拟模型包括多个虚拟模型时,步骤410中的模型片元是由多个模型片元组成的最终的模型片元。
片元(fragment)是将三维模型光栅化后得到的屏幕空间内的过渡像素点,称之为过渡像素点而非像素点的原因是:对于一个观察画面上一个位置的一个像素点,可能是由多个模型上的多个片元经过测试和融合后才得到最终显示在观察画面上的像素点。
例如,对于屏幕空间上的第一位置,第一模型经过光栅化后得到的第一片元位于第一位置,第二模型经过光栅化后得到的第二片元同样位于第一位置,但是由于第二模型在第一位置的深度值小于第一模型在第一位置的深度值,即,根据屏幕空间的第一位置在世界空间中映射出的直线上,第二模型位于第一模型的前方,第一模型的第一片元会被第二模型的第二片元遮挡,因此,第一位置上最终输出的像素点为第二模型的第二片元,第一模型的第一片元则会被舍弃。
“片元”在部分教材中也被称为“片段”。
一个模型经过光栅化可以得到至少一个片元,步骤410中的模型片元代指了虚拟模型经过光栅化后得到的至少一个模型片元。
步骤420,在贴花片上渲染贴花,得到贴花片的贴花片元,贴花片位于摄像机模型与虚拟模型之间,摄像机模型用于透过贴花片观察虚拟模型得到观察画面。
贴花片是世界空间中的一个有边界的平面(片面)。贴花片可以理解为一个透明片或半透明片。贴花片本身为透明的,根据贴花显示在屏幕空间的位置,会在贴花片上的部分位置会着色,使得贴花片上显示贴花的图案,得到一个半透明片,摄像机模型透过半透明片观察虚拟模型就可以看到贴花片上被着色的部分显示在虚拟模型上的画面,达到在虚拟模型上贴贴花的效果。
示例性的,贴花片所在的平面(贴花平面)垂直于摄像机模型的拍摄方向,即,贴花片上各个点的深度值相同。当然,贴花片所在的平面也可以与摄像机模型的拍摄方向呈一定角度,但不能与摄像机模型的拍摄方向平行。
贴花片的形状和大小可以是任意的。当然,为了提高渲染速度,减少不必要的运算,贴花片渲染至屏幕空间后的形状和大小,约贴近贴花在屏幕空间显示出的范围,其渲染效率越高,这部分的方法会在之后的示例性实施例中介绍。
贴花片位于摄像机模型与虚拟模型之间是指,贴花片的深度值要小于虚拟模型上任意一点的深度值,从而保证在贴花片元覆盖模型片元。
本实施例提供的方法,其思路为:根据摄像机模型当前的视角,确定出在虚拟模型上贴上贴花后,该贴花会在观察画面(屏幕空间)中显示出怎样的图案,然后将该图案着色给贴花片,如此,不需要在虚拟模型上着色,仅需要在贴花片上着色,将虚拟模型的片元与贴花片的片元一叠加,就可以在最终得到的观察画面上得到虚拟模型上贴着贴花的效果。使用这种方法,无论该贴花会贴在几个虚拟模型上,无论该贴花在一个虚拟模型上会不会覆盖不同材质的网格,都仅需要根据最终贴花在屏幕空间上的显示位置为贴花片着色。相比于相关技术中,根据贴花覆盖的范围,为该范围内不同模型不同材质的多个网格使用多个drawcall分别渲染的方法,由于贴花片仅为一个模型一种材质,因此仅需使用一个drawcall就可以实现贴花的渲染,大大提高了贴花渲染的效率,提高游戏性能。
同样地,步骤420中贴花片元是指渲染贴花片得到的至少一个片元。
步骤430,在模型片元上叠加贴花片元生成观察画面,观察画面上显示有贴有贴花的虚拟模型。
在得到模型片元和贴花片元后,将贴花片元与模型片元进行测试和融合,由于贴花片的深度值小于虚拟模型的深度值,即,在拍摄方向上贴花片位于虚拟模型的前方,则贴花片元会叠加在模型片元的上方,最终生成观察画面。
示例性的,贴花片元可以覆盖完整的观察画面,也可以仅覆盖观察画面的一部分区域。
综上所述,本申请实施例提供的方法,通过在摄像机模型与虚拟模型之间设置贴花片,在贴花片上渲染贴花,使摄像机模型透过贴花观察虚拟模型,进而使摄像机模型生成的观察画面中在虚拟模型上贴有贴花。在渲染过程中,计算机设备先渲染虚拟模型得到模型片元,再渲染贴花得到贴花片元,然后在模型片元上叠加贴花片元,即可实现在模型上贴上贴花的效果。由于贴花片是一个单独的模型,仅具有一个网格,因此,在贴花片上渲染贴花仅需进行一次drawcall,相比于相关技术中的方法,大大降低了在虚拟模型上渲染一个贴花所需的drawcall数量,提高了游戏渲染的性能。
示例性的,给出一种在世界空间中设置贴花片,以及在贴花片上渲染贴花的方法。
图5示出了本申请一个示例性实施例提供的图像处理方法的流程图。该方法可以由计算机设备来执行,例如,如图3所示的终端或服务器来执行。基于图4所示的示例性实施例,步骤410之前还包括步骤401,步骤420还包括步骤421至步骤423。
步骤401,设置贴花片的位置和尺寸。
计算机设备在世界空间中放置贴花片,设置贴花片的位置和尺寸。示例性的,本实施例以贴花片垂直于摄像机模型的拍摄方向为例,提供了一种设置贴花片的位置和尺寸的方法。
计算机设备在预置位置设置贴花片,预置位置包括根据指定深度在世界空间中确定的平面;根据贴花在屏幕空间的显示范围设置贴花片的尺寸,屏幕空间为摄像机模型生成观察画面的二维空间。
预制位置是指预制深度,例如,用户将贴花片统一设置在深度值为2的平面上。预制位置用于确定贴花片所在的平面。
示例性的,使用一个贴花片在虚拟模型上渲染一个贴花,当需要渲染多个贴花时需要用到多个贴花片。多个贴花片可以都位于同一个平面上,多个贴花片也可以分别位于不同的平面上。当多个贴花片位于同一个平面上时,用户可以预先设置每个贴花片的渲染优先级,渲染优先级用于确定同一平面内的多个贴花片谁优先显示在上层。
示例性的,为了降低渲染中的运算,提高渲染效率,本实施例会根据贴花在屏幕空间中实际占用的显示范围来设置贴花片尺寸和位置。
本实施例提供了两种根据贴花在屏幕空间的显示范围确定贴花尺寸的方法,第一种是根据显示范围的包围盒设置贴花片的大小,第二种是根据显示范围的实际大小设置贴花片的大小。
第一种方法:贴花片呈矩形,计算机设备根据贴花在虚拟模型上的投影范围,在世界空间中设置投影体,世界空间用于放置虚拟模型、贴花片和摄像机模型,投影体为投影范围的最小包围盒;将投影体映射至屏幕空间得到二维投影体;根据二维投影体确定显示范围,显示范围为二维投影体的最小包围盒;根据贴花片在世界空间所处的贴花平面,将显示范围从屏幕空间映射至世界空间,得到贴花片坐标;根据贴花片坐标设置贴花片的尺寸。
即,计算机设备现在局部空间创建一个单位立方体,然后根据贴花的投影范围将单位立方体经过缩放后,放置到世界空间中,使经过缩放的单位立方体(投影体)正好覆盖投影范围。将投影体的八个顶点映射到屏幕空间得到八个顶点坐标(二维投影体),然后求这八个顶点坐标的最小包围盒(显示范围),显示范围为边平行于观察画面的矩形,再将显示范围映射回世界空间中贴花片所在的贴花平面上,得到四个顶点坐标,将这四个顶点坐标设置为贴花片的四个顶点坐标,进而确定了贴花片在贴花平面上的位置和尺寸。
第二种方法:贴花片呈任意形状(如果贴花在屏幕空间上的显示范围包括了多个零散的小范围,则该贴花片也可以由多个零散片组成)。计算机设备将贴花在虚拟模型上的投影范围,从世界空间映射至屏幕空间,得到显示范围,世界空间用于放置虚拟模型、贴花片和摄像机模型;根据贴花片在世界空间所处的贴花平面,将显示范围从屏幕空间映射至世界空间,得到贴花片坐标;根据贴花片坐标设置贴花片的尺寸。
即,计算机设备直接将世界空间中贴花的投影范围映射到屏幕空间中,得到贴花的显示范围,然后将显示范围映射回世界空间中贴花片所在的贴花平面,得到贴花片在贴花平面的位置、尺寸,根据得到的位置、尺寸设置贴花片。
步骤421,将贴花片光栅化得到未着色的贴花片元。
计算机设备将贴花片在世界空间中各个顶点的顶点信息输入顶点着色器,进行顶点着色,然后进行图元装配和光栅化,最终得到贴花片在屏幕空间中的多个贴花片元。
步骤422,获取贴花片元与贴花的颜色的对应关系。
计算机设备根据贴花映射到屏幕空间后的位置,对对应位置的贴花片元进行着色,因此,需要先根据每个贴花片元在屏幕空间的位置,对应获取虚拟模型贴上贴花后,贴花映射到屏幕空间在该位置的颜色,使用该颜色对该贴花片元进行着色。
示例性的,计算机设备根据贴花片元在屏幕空间的显示位置,得到贴花片元与虚拟模型的模型片段的对应关系,屏幕空间为摄像机模型生成观察画面的二维空间,模型片段对应的模型片元位于屏幕空间的显示位置;根据贴花的投影方式,将模型片段映射至贴花的投影空间,得到模型片段与贴花的颜色的对应关系;根据贴花片元与模型片段的对应关系、以及模型片段与贴花的颜色的对应关系,得到贴花片元与贴花的颜色的对应关系。
示例性的,贴花片元和模型片元都是在屏幕空间,贴花片元会覆盖在模型片元之上,则存在与贴花片元位置相同的模型片元,则该位置相同的贴花片元和模型片元具有对应关系。该模型片元映射回世界空间,可以得到该模型片元在虚拟模型上对应的模型片段,模型片段是指虚拟模型上的一小个三维区域(也可以称为三维表面)。则可以建立贴花片元与该模型片段的对应关系。然后,根据贴花的投影方式(投影位置、投影方向、投影范围等)可以确定出一个投影平面,投影平面中有贴花,根据投影平面与世界空间的转换矩阵,可以将世界空间的模型片段映射到投影空间,即可以得到模型片段在投影空间的位置,贴花上各个像素点本身就在投影空间有确定的位置,根据位置可以确定模型片段对应的贴花像素点的颜色。进而依据模型片段与贴花片元的对应关系,可以得到贴花片元与贴花的颜色的对应关系。也可以理解为:根据贴花的投影方式,确定模型片段会被投影到什么颜色,然后根据模型片段与贴花片元的对应关系,确定出贴花片元与贴花的颜色的对应关系。
示例性的,贴花片元与模型片段的对应关系是基于模型深度图得到的。计算机设备在渲染虚拟模型时会得到模型片元和模型深度图。即,计算机设备渲染虚拟模型,得到虚拟模型的模型深度图,模型深度图包括模型片元对应的深度信息;根据贴花片元在屏幕空间的显示位置,以及模型片元在屏幕空间的位置,从模型深度图中获取与贴花片元对应的深度信息;根据深度信息和显示位置获取虚拟模型上的模型片段。
即,计算机设备根据贴花片元在屏幕空间的显示位置,从模型深度图上对应获取在显示位置的深度信息,然后根据屏幕空间的显示位置(二维坐标)以及世界空间的深度信息,得到该显示位置在世界空间中对应的虚拟模型上的模型片段。该模型片段则与该贴花片元存在对应关系。
步骤423,基于贴花片元与贴花的颜色的对应关系,对未着色的贴花片元进行着色,得到贴花片元。
在得到贴花片元对应的贴花颜色后,就可以用该颜色对该贴花片元进行着色。
其中,步骤422和步骤423是针对一个贴花片元的着色步骤,使用该方法可以对贴花片的全部贴花片元进行着色,进而在贴花片上渲染贴花,得到贴花片元。
综上所述,本申请实施例提供的在虚拟模型上贴花的方法,通过根据贴花在屏幕空间中的显示范围,设置贴花片的大小,从而减少渲染贴花片的运算量,铁镐贴花的渲染效率。
本申请实施例提供的在虚拟模型上贴花的方法,通过基于贴花片元在屏幕空间上的显示位置,以及模型片元在屏幕空间上的显示位置,确定与贴花片元对应的模型片元,进而获取模型片元在世界空间中对应的模型片段,基于贴花的投影方式,确定贴花投影到模型片段上的颜色,进而确定贴花片元需要被着色的颜色,对贴花片元进行着色,从而实现在贴花片上渲染贴花。
本申请实施例提供的在虚拟模型上贴花的方法,基于模型深度图确定贴花片元对应的模型片段,可以实现在半透明模型上准确贴贴花。相关技术的方法对贴花的渲染,是先获得被投影的虚拟模型的网格,然后在网格上重新绘制贴花,但是虚拟模型上可能存在部分位置为透明的,相关技术中的方法只获取虚拟模型的网格无法获知该虚拟模型上的透明位置,而是会对网格的全部位置进行贴花绘制,因此,在最终得到的观察画面中,贴花可能会被贴到透明部分上,显示出贴花贴在空中的效果。而本实施例提供的方法,在对虚拟模型进行渲染后基于模型深度图进行贴花的渲染,由于在对虚拟模型进行渲染时已经根据了各个模型的透明通道信息确定了模型上各个位置的透明度,才渲染得到的模型片元,因此,透明部分不会体现在模型片元中,基于模型片元的模型深度图确定出的模型片段,也就不会包含虚拟模型的透明部分,因此,贴花也不会被贴到虚拟模型的透明部分上,实现在半透明模型上的准确贴花。
示例性的,采用本申请实施例提供的贴花方法,还可以实现法线贴花、贴花定制高度、贴花定制反射、贴花溶解等多种贴画效果。
一、法线贴花。
法线贴花就是在原贴花的凹凸表面的每个点上均作法线,通过rgb颜色通道来标记法线的方向,可以理解成与原凹凸表面平行的另一个不同的表面,但实际上它又只是一个光滑的平面。对于视觉效果而言,它的视觉效果比原有的凹凸表面更高,若在特定位置上应用光源,可以让细节程度较低的表面生成高细节程度的精确光照方向和反射效果。示例性的,法线贴花上记录了每个点的法线,根据贴花的贴花法线和光照方向,可以使贴花呈现不同的明暗关系,从而使贴花更加立体。
例如,如图6所示,为一张带有贴花法线信息的法线贴花601,其中,图6左侧的图为效果图,图6右侧的图为示意图。该法线贴花601中每个像素点存储了该像素点的颜色以及该像素点的法线信息。如图7所示,对于同一个贴花,使用不带有贴花法线的贴花渲染出的第一效果602仅为将贴花贴到平面上的平面效果,而使用带有贴花法线的法线贴花渲染出的第二效果603,虽然同样是贴在平面上,但第二效果603带有更为细致真实的光影反射效果,其中,图7上方的一组图为效果图,图7下方的一组图为示意图。
基于图5所示的示例性实施例,可以将步骤422替换为以下方法来实现法线贴花。
计算机设备基于贴花片元与贴花的颜色对应关系,获取贴花片元的初始颜色;基于贴花片元与贴花的颜色对应关系,获取贴花法线;获取环境光照方向;基于环境光照方向、贴花法线和初始颜色确定出的最终颜色,对未着色的贴花片元进行着色,得到贴花片元。
初始颜色即为贴花的图片文件中记录的各个像素点的颜色。
该方法中应用的贴花为法线贴花,即,在贴花的图片文件中不仅记录了每个像素点的颜色,还记录有每个像素点的贴花法线。
环境光照方向为世界空间中设置的光源的光照方向。
实现法线贴花的伪代码如下。
fixed3n=unpacknormal(tex2d(_normaltex,projuv));
其中,unpacknormal为对法线贴花进行采样的函数;tex2d为对二维贴花查询的函数;projuv为贴花片元在投影空间中对应的uv坐标(uv坐标用于在贴花中确定位置,进而确定颜色);n为贴花片元对应的贴花法线;_normaltex为法线贴花。
half3l=normalize(unityworldspacelightdir(worldspacepos.xyz));
其中,normalize是归一化函数;unityworldspacelightdir为环境光照方向;worldspacepos.xyz为贴花片元对应的模型片段的世界空间坐标;l为模型片段处的环境光照方向。
halfnol=saturate(dot(n,l));
其中,saturate(x)用于将输入值x限制在[0,1]之间;dot返回n和l的点积。
half3col=nol*_lightintensity*_sunlightcolor_c.rgb;
其中,col为最终颜色;_lightintensity为环境光的光照强度;_sunlightcolor_c.rgb为环境光的颜色。
二、贴花定制高度。
贴花定值高度是指,可以通过设置贴画中部分像素点的透明度的方式来实现任意设置贴花在虚拟环境中覆盖的纵向高度、横向范围等。例如,根据贴花片元与贴花中心在世界空间中的距离关系,来将距离较远的贴花片元的透明度设置为0,即实现将远处的贴花片元不着色的效果,进而实现定值贴花高度的效果。
例如,如图8所示,可以将虚拟模型上贴花的高度渲染为第一高度604,或,第二高度605,其中,图8上方的一组图为效果图,图8下方的一组图为示意图。
基于图5所示的示例性实施例,可以将步骤422替换为以下方法来实现贴花定制高度。
计算机设备基于贴花片元与贴花的颜色对应关系,获取贴花片元的初始颜色;基于第一位置与第二位置的距离确定透明度,第一位置为贴花片元在世界空间的位置,第二位置为贴花的中心点在世界空间的位置;基于初始颜色与透明度确定出的最终颜色,对未着色的贴花片元进行着色,得到贴花片元。
示例性的,假设第一位置与第二位置的距离为第一距离,则计算阈值距离,与第一距离的第一差,根据第一差获取对应的透明度。阈值距离为用户预设的定制距离。
示例性的,可以预设第一差和透明度的对应列表,例如,第一差大于第一阈值透明度为1,之后随着第一差的减小透明度逐渐增加,直至第一差为0透明度为0。如此,可以在定值贴花高度的同时实现过渡效果。
实现贴花定制高度的伪代码如下。
fixedgradiant=abs(worldspacepos.y-_centerposition.y);
其中,worldspacepos.y为贴花片元在世界空间中的y轴坐标;_centerposition为贴花中心在世界空间中的y轴坐标;abs为求绝对值的函数。
fixedalphaheight=lerp(0,mask.r,saturate((_baseheight-gradiant)/3));
其中,_baseheight设置的贴花高度(阈值距离);saturate(x)函数的作用是如果x取值小于0,则返回值为0,如果x取值大于1,则返回值为1,若x在0到1之间,则直接返回x的值;mask.r是贴花片元在遮罩图的r通道的数据。
returnfloat4(col.rgb,alphaheight*_color.a*step(gradiant,_baseheight);
其中,col.rgb为贴花片元的初始颜色,step为函数,_color.a为贴花片元a通道的数据(a通道用于存储贴花的透明度数据)。
三、贴花定制反射。
贴花定制反射是指根据贴花的贴花法线、环境光照、摄像机模型的拍摄方向,生成镜面反射的效果。
例如,使用如图9所示的冰面贴花606,其中,图9左侧的图为效果图,图9右侧的图为示意图;将其贴到地面上增加镜面反射后,可以得到如图10所示的在冰面反射607效果,其中,图10上方的图为效果图,图10下方的图为示意图。
基于图5所示的示例性实施例,可以将步骤422替换为以下方法来实现贴花定制反射。
计算机设备基于所述贴花片元与所述贴花的颜色对应关系,获取所述贴花片元的初始颜色;基于所述贴花片元与所述贴花的颜色对应关系,获取贴花法线;获取环境光照方向和所述摄像机模型的拍摄方向;基于所述环境光照方向、所述拍摄方向、所述贴花法线和所述初始颜色确定出的镜面反射颜色,对未着色的所述贴花片元进行着色,得到所述贴花片元。
实现贴花定制反射的伪代码如下。
fixed4col=tex2d(_maintex,projuv);
其中,maintex为贴花;col为贴花片元的初始颜色。
fixed3n=unpacknormal(tex2d(_normaltex,mainuv));
其中,_normaltex为贴花的贴花法线图;mainuv是贴花片元在贴花的投影平面上对应的位置。
half3l=normalize(unityworldspacelightdir(worldspacepos.xyz));
halfnol=saturate(dot(n,l));
col.rgb+=nol*_lightintensity*_sunlightcolor_c.rgb;
half3v=normalize(unityworldspaceviewdir(worldspacepos.xyz));
其中,unityworldspaceviewdir为摄像机模型的视角调用函数,worldspacepos.xyz为贴花片元在世界空间的位置。
half3h=normalize(v+l);
halfnoh=saturate(dot(n,h));
col.rgb+=noh*_specularintensity*_specularcolor.xyz;
其中,_specularintensity为镜面反射光的光照强度;_specularcolor.xyz为镜面反射光的颜色。
四、贴花定制溶解。
贴花定制溶解是指在贴花上形成溶解效果,随着时间推移,贴花上部分位置的颜色逐渐消失,例如,贴花从左向右溶解,或自内向外溶解,或按照任意预设形状溶解等。
例如,如图11所示,渲染出贴花从中心位置向四周溶解的第一溶解贴花608的效果,其中,内部一圈溶解边缘被着色为深色,其中,图11上方的图为效果图,图11下方的图为示意图。如图12所示,渲染出贴花从右下向坐上位置溶解的第二溶解贴花609的效果,其中,右下的溶解边缘被着色为深色,其中,图12上方的图为效果图,图12下方的图为示意图。
基于图5所示的示例性实施例,可以将步骤422替换为以下方法来实现贴花定制溶解。
计算机设备基于所述贴花片元与所述贴花的颜色对应关系,获取所述贴花片元的初始颜色;计算第三位置到第四位置的第一向量,所述第三位置为所述贴花的中心点在所述世界空间的位置,所述第四位置为所述贴花片元在世界空间的位置;基于所述贴花片元与所述贴花的颜色对应关系,从与所述贴花对应的溶解贴图上获取所述贴花片元对应的第一溶解值,所述溶解贴图用于为所述贴花的溶解区域着色;计算第一向量与溶解方向向量的点积,得到溶解距离;计算所述第一溶解值与所述溶解距离之和得到第二溶解值;基于所述第二溶解值与溶解位置得到所述贴花片元与溶解边缘的边缘距离;基于所述变远距离、所述初始颜色、溶解边缘颜色确定出的溶解颜色,对未着色的所述贴花片元进行着色,得到所述贴花片元。
示例性的,溶解贴图用于对贴花中发生溶解的溶解区域进行着色,溶解贴图中的溶解值为0-1的数值,溶解贴图为灰度图。例如,如图13所示,为一种黑白的溶解贴图610,当然为了更好的过渡效果,可以使用不同灰度的灰色过渡黑白边界,其中,图13上方的图为效果图,图13下方的图为示意图。
实现贴花定制溶解的伪代码如下。
float3pos=worldspacepos.xyz-_centerposition.xyz;
fixeddissovle=tex2d(_dissolvetex,dissovleuv).r;
其中,_dissolvetex为溶解贴图;dissovleuv为贴花片元在溶解贴图中对应的uv坐标;r为溶解贴图的红通道的数值;dissovle为第一溶解值。
floatdist=dot(normalize(_dissolvedir),pos.xz);
其中,_dissolvedir为溶解方向,dist为溶解距离。
dissovle=dissovle+dist*_inverse;
其中,“=”之前的dissovle为第二溶解值,“=”之前的dissovle为第一溶解值;_inverse是预设的参数,其取值为-1或1,用于将溶解方向反向。
floatedge=saturate(1-saturate((dissovle-_clip+(1-_edgewidth))));
其中,edge为贴花片元与溶解边缘的距离;_clip为溶解位置;_edgewidth为溶解边缘的宽度。
edge*=edge;
edge*=edge;
col.rgb=lerp(col.rgb,_dissolvecolor.rgb*_dissolveintensity,edge);
其中,col.rgb为溶解颜色,_dissolvecolor.rgb为溶解边缘的颜色;_dissolveintensity为溶解边缘的强度。
returnfloat4(col.rgb,step(0.5,dissolve_alpha));
其中,dissolve_alpha=step(_clip,dissovle),用于根据第二溶解值,将被溶解部分的透明度设置为0。
示例性的,给出一种在unity引擎中构造贴花片和渲染贴花片的示例性实施例。
图14示出了本申请一个示例性实施例提供的图像处理方法的流程图。该方法可以由计算机设备来执行,例如,如图3所示的终端或服务器来执行。该方法包括以下步骤:
步骤701,构造投影立方体。
计算机设备在局部空间构造单位立方体(投影立方体),示例性的,投影立方体(投影体)是长度为1的立方体,无论贴花的投影范围多大,其在局部空间构造的投影立方体都相同。
步骤701的伪代码为:
其中,vector3为投影立方体。
步骤702,将投影立方体的顶点从局部空间转换到世界空间。
示例性的,根据贴花的投影范围,缩放投影立方体之后,将其放置在世界空间中。
步骤702的伪代码如下:其中i为[0,7]之间的整数(下同)。
worldpos[i]=this.transform.transformpoint(verts[i])。
其中,this.transform.transformpoint为局部空间到世界空间的转换api(applicationprogramminginterface,应用程序接口),worldpos[i]为投影立方体上各个顶点在世界空间的坐标。
步骤703,将投影立方体的顶点从世界空间转换到观察空间。
观察空间是根据摄像机模型的位置确定的三维空间。
步骤703的伪代码如下:
viewpos[i]=maincamera.worldtoviewportpoint(worldpos[i])。
其中,maincamera.worldtoviewportpoint为世界空间到观察空间的转换api,viewpos[i]为投影立方体上各个顶点在观察空间的坐标。
步骤704,将投影立方体的顶点从观察空间转换到屏幕空间。
步骤704的伪代码如下:
screenpos[i]=maincamera.viewporttoscreenpoint(viewpos[i])。
其中,maincamera.viewporttoscreenpoint为观察空间到屏幕空间的转换api,screenpos[i]为投影立方体上各个顶点在屏幕空间的坐标。
步骤705,在屏幕空间裁剪出包围投影立方体八个顶点的最小包围盒。
screenpos[i]包括投影立方体的八个顶点,viewcullpos中存储了最小包围盒的四个顶点。
步骤705的伪代码如下:
if(screenpos[i].x>viewcullpos[2])viewcullpos[2]=screenpos[i].x;
elseif(screenpos[i].x<viewcullpos[0])viewcullpos[0]=screenpos[i].x;
if(screenpos[i].y>viewcullpos[3])viewcullpos[3]=screenpos[i].y;
elseif(screenpos[i].y<viewcullpos[1])viewcullpos[1]=screenpos[i].y。
步骤706,将最小包围盒转换回世界空间。
步骤706的伪代码如下:
worldcullpos[0]=screentoworld(newvector3(viewcullpos[0],viewcullpos[3],0),this.transform)。
其中,worldcullpos[0]为最小包围盒在世界空间的坐标,screentoworld为屏幕空间到世界空间的转换api,viewcullpos[i]为最小包围盒在观察空间的坐标。
步骤707,为贴花片的网格设置矩形坐标。
示例性的,根据步骤706中将最小包围盒转换回世界空间得到的四个顶点坐标,设置贴花片四个顶点的坐标。
步骤707的伪代码如下:
for(inti=0;i<4;i++)
localcullpos[i]=this.transform.inversetransformpoint(worldcullpos[i]);
this.gameobject.getcomponent<meshfilter>().sharedmesh.vertices=localcullpos。
其中,localcullpos[i]为贴花片在世界空间的坐标。
步骤708,渲染贴花片。
在设置好贴花片后,在贴花片上渲染贴花。
当摄像机模型的拍摄视角发生变换时候,会重新执行步骤703及后续步骤;当贴花的位置发生改变,会重新执行步骤702及后续步骤。
图15示出了本申请一个示例性实施例提供的图像处理方法的流程图。该方法可以由计算机设备来执行,例如,如图3所示的终端或服务器来执行。该方法包括以下步骤:
步骤801,获取贴花片元在屏幕空间的坐标。
步骤801的伪代码如下:
fixed4screenpos=i.screenpos;
screenpos.xy=screenpos.xy/screenpos.w。
其中,screenpos为贴花片元在屏幕空间的坐标。
步骤802,采样深度图。
示例性的,计算机设备根据贴花片元在屏幕空间的坐标,从深度图(模型深度图/场景深度图)中采样得到屏幕空间中该位置对应的深度信息。
步骤802的伪代码如下:
floatdepth=tex2d(_cameradepthtexture,screenpos).r。
其中,depth为贴花片元的深度信息,_cameradepthtexture为深度图,r为深度图r通道的信息。
因为深度图包含了植被等半透明物体的深度信息,因此渲染后得到的贴花可以贴到半透明的植被上。
步骤803,根据深度图计算贴花片元在裁剪空间的坐标。
步骤803的伪代码如下:
fixed4clippos=fixed4(screenpos.x*2-1,screenpos.y*2-1,-depth*2+1,1)。
其中,clippos为贴花片元在裁剪空间的坐标。
步骤804,计算贴花片元在观察空间的坐标。
步骤804的伪代码如下:
fixed4cameraspacepos=mul(unity_camerainvprojection,clippos)。
其中,cameraspacepos为贴花片元在观察空间的坐标,unity_camerainvprojection为裁剪空间到观察空间的变换矩阵。
步骤805,计算贴花片元在世界空间的坐标。
步骤805的伪代码如下:
fixed4worldspacepos=mul(unity_matrixinvv,cameraspacepos)。
其中,worldspacepos为贴花片元在世界空间的坐标,unity_matrixinvv为观察空间到世界空间的变换矩阵。
步骤806,计算贴花片元在投影空间的坐标。
步骤806的伪代码如下:
fixed4projectorpos=mul(_worldtoprojector,worldspacepos);
projectorpos/=projectorpos.w。
其中,projectorpos为贴花片元在投影空间的坐标,_worldtoprojector为世界空间到投影空间的变换矩阵。
步骤807,计算投影uv。
步骤807的伪代码如下:
fixed2projuv=projectorpos.xy*0.5+0.5;
其中,projuv为贴花片元对应的投影uv,投影uv为在投影空间中的位置。
步骤808,根据材质设置渲染。
使用投影uv可以对贴花进行采样,进行光照渲染,渲染过程与正常渲染过程相同。
示例性的,给出一种在unity引擎中使用基于本申请提供的在虚拟模型上贴花的方法开发的脚本的示例性实施例。
首先,将贴花、遮罩贴图设置wrapmode(循环模式)为clamp,clamp指不循环。
如图16所示,新建object(对象),挂上脚本cubeprojector(投影立方体),脚本会重新生成meshfilter(网格过滤器)901,名为quadprojector(四投影仪)。
如图17所示,为object增加meshrenderer(网格渲染)902组件,为节约性能,相关参数的设置如图17所示。
如图18所示,在材质球中制作贴花效果,并保存为prefab(预制体)903。
如图19所示,为材质球选择shader(着色器)904,并设置相应参数,其中,图19上方的图为效果图,图19下方的图为示意图。
如图20所示,游戏运行时,会自动加载”名称.prefab“。贴花905可以在“表现组”中配置,拖入daojia2.prefab即可。
本申请实施例实现了以下效果。
(1)贴花可以定制高度
该贴花支持设置[截断高度]、贴花的[旋转角]。截断高度可将贴花特效限定在一定范围内,满足特效美术要求。特效颜色均为hdr、gamma颜色,如图8所示。
(2)贴花可以定制法线贴花
本申请实施例支持为贴花增加法线,产生漫反射效果,适合“地裂”等具有一定深度的特效,如图7所示。
(3)贴花可以定制反射
本申请实施例支持带有复杂光照的贴花,可以通过[高光属性]面板,设置高光颜色、强度,适合“冰”等带有明显反射的特效,如图10所示。
(4)贴花可以定制溶解
本申请实施例提供的方法,支持将贴花沿径向、任一方向“溶解”。同时,溶解边缘颜色、宽度,可通过面板[溶解宽度]、[溶解颜色]设置。如图11和图12所示。
此外,本申请实施例提供的方法还能实现以下效果。
首先,草、树叶、地形等物体在相关技术的贴花方法中,由于需要用到贴图做运算(如clip操作等),因此出现穿帮现象。相关技术中的方法,会设置ignoreprojector(忽略投影仪)进行忽略。如图21所示,贴花906对树叶、草没有影响,且地形起伏部分有穿插,其中图21上方的图为效果图,图21下方的图为示意图。而本申请实施例提供的方法,由于是基于已经渲染好的模型片元(模型深度图)来对贴花片元进行的着色,不依据模型的网格对贴花进行绘制,则不会产生这种现象。
其次,渲染贴花过程中的drawcall与被投影的虚拟模型的数量正相关,复杂环境下,贴花的渲染效率较低。如图22所示,采用相关技术907需要29个drawcall(4个为无关渲染,33-4=29),相关技术所使用的分析工具为unity的framedebug,而采用本申请实施例908需要1个drawcall(4个为无关渲染,5-4=1),不进行贴花渲染909需要4个drawcall,其中,图22上方的图为效果图,图22下方的图为示意图。
最后,传统unity贴花会对贴花覆盖的所有模型的网格体进行绘制,本申请提供的贴花片会根据贴花在屏幕中的大小进行自适应变化,进一步节约在贴花片上渲染贴花的性能。如图23所示,根据第一贴画910在屏幕中的大小,将第一贴花片911设置为对应大小,其中,图23上方的一组图为效果图,图23下方的一组图为示意图。如图24所示,根据第二贴画912在屏幕中的大小,将第二贴花片913设置为对应大小,其中,图24上方的一组图为效果图,图24下方的一组图为示意图。
以下为本申请的装置实施例,对于装置实施例中未详细描述的细节,可参考上述方法实施例。
图25是本申请一个示例性实施例提供的在虚拟模型上贴花的装置的框图。所述装置包括:
模型渲染模块501,用于渲染所述虚拟模型,得到所述虚拟模型的模型片元;
贴花渲染模块502,用于在贴花片上渲染所述贴花,得到所述贴花片的贴花片元,所述贴花片位于摄像机模型与所述虚拟模型之间,所述摄像机模型用于透过所述贴花片观察所述虚拟模型得到观察画面;
生成模块503,用于在所述模型片元上叠加所述贴花片元生成所述观察画面,所述观察画面上显示有贴有所述贴花的所述虚拟模型。
在一个可选的实施例中,所述贴花渲染模块502,用于将所述贴花片光栅化得到未着色的所述贴花片元;获取所述贴花片元与所述贴花的颜色的对应关系;基于所述贴花片元与所述贴花的颜色的对应关系,对未着色的所述贴花片元进行着色,得到所述贴花片元。
在一个可选的实施例中,所述贴花渲染模块502,用于根据所述贴花片元在屏幕空间的显示位置,得到所述贴花片元与所述虚拟模型的模型片段的对应关系,所述屏幕空间为所述摄像机模型生成所述观察画面的二维空间,所述模型片段对应的所述模型片元位于所述屏幕空间的所述显示位置;
所述贴花渲染模块502,用于根据所述贴花的投影方式,将所述模型片段映射至所述贴花的投影空间,得到所述模型片段与所述贴花的颜色的对应关系;
所述贴花渲染模块502,用于根据所述贴花片元与所述模型片段的对应关系、以及所述模型片段与所述贴花的颜色的对应关系,得到所述贴花片元与所述贴花的颜色的对应关系。
在一个可选的实施例中,所述模型渲染模块501,用于渲染所述虚拟模型,得到所述虚拟模型的模型深度图,所述模型深度图包括所述模型片元对应的深度信息;
所述贴花渲染模块502,用于根据所述贴花片元在所述屏幕空间的显示位置,以及所述模型片元在所述屏幕空间的位置,从所述模型深度图中获取与所述贴花片元对应的所述深度信息;
所述贴花渲染模块502,用于根据所述深度信息和所述显示位置获取所述虚拟模型上的所述模型片段。
在一个可选的实施例中,所述装置还包括:
贴花设置模块504,用于设置所述贴花片的位置和尺寸。
在一个可选的实施例中,所述贴花设置模块504,用于在预置位置设置所述贴花片,所述预置位置包括根据指定深度在世界空间中确定的平面;根据所述贴花在屏幕空间的显示范围设置所述贴花片的尺寸,所述屏幕空间为所述摄像机模型生成所述观察画面的二维空间。
在一个可选的实施例中,所述贴花片呈矩形;
所述贴花设置模块504,用于根据所述贴花在所述虚拟模型上的投影范围,在世界空间中设置投影体,所述世界空间用于放置所述虚拟模型、所述贴花片和所述摄像机模型,所述投影体为所述投影范围的最小包围盒;将所述投影体映射至所述屏幕空间得到二维投影体;根据所述二维投影体确定所述显示范围,所述显示范围为所述二维投影体的最小包围盒;根据所述贴花片在所述世界空间所处的所述贴花平面,将所述显示范围从所述屏幕空间映射至所述世界空间,得到贴花片坐标;根据所述贴花片坐标设置所述贴花片的尺寸。
在一个可选的实施例中,所述贴花设置模块504,用于将所述贴花在所述虚拟模型上的投影范围,从世界空间映射至所述屏幕空间,得到所述显示范围,所述世界空间用于放置所述虚拟模型、所述贴花片和所述摄像机模型;根据所述贴花片在所述世界空间所处的所述贴花平面,将所述显示范围从所述屏幕空间映射至所述世界空间,得到贴花片坐标;根据所述贴花片坐标设置所述贴花片的尺寸。
在一个可选的实施例中,所述贴花渲染模块502,用于基于所述贴花片元与所述贴花的颜色对应关系,获取所述贴花片元的初始颜色;基于第一位置与第二位置的距离确定透明度,所述第一位置为所述贴花片元在世界空间的位置,所述第二位置为所述贴花的中心点在所述世界空间的位置;基于所述初始颜色与所述透明度确定出的最终颜色,对未着色的所述贴花片元进行着色,得到所述贴花片元。
在一个可选的实施例中,所述贴花渲染模块502,用于基于所述贴花片元与所述贴花的颜色对应关系,获取所述贴花片元的初始颜色;基于所述贴花片元与所述贴花的颜色对应关系,获取贴花法线;获取环境光照方向;基于所述环境光照方向、所述贴花法线和所述初始颜色确定出的最终颜色,对未着色的所述贴花片元进行着色,得到所述贴花片元。
在一个可选的实施例中,所述贴花渲染模块502,用于基于所述贴花片元与所述贴花的颜色对应关系,获取所述贴花片元的初始颜色;基于所述贴花片元与所述贴花的颜色对应关系,获取贴花法线;获取环境光照方向和所述摄像机模型的拍摄方向;基于所述环境光照方向、所述拍摄方向、所述贴花法线和所述初始颜色确定出的镜面反射颜色,对未着色的所述贴花片元进行着色,得到所述贴花片元。
在一个可选的实施例中,所述贴花渲染模块502,用于基于所述贴花片元与所述贴花的颜色对应关系,获取所述贴花片元的初始颜色;计算第三位置到第四位置的第一向量,所述第三位置为所述贴花的中心点在所述世界空间的位置,所述第四位置为所述贴花片元在世界空间的位置;基于所述贴花片元与所述贴花的颜色对应关系,从与所述贴花对应的溶解贴图上获取所述贴花片元对应的第一溶解值,所述溶解贴图用于为所述贴花的溶解区域着色;计算第一向量与溶解方向向量的点积,得到溶解距离;计算所述第一溶解值与所述溶解距离之和得到第二溶解值;基于所述第二溶解值与溶解位置得到所述贴花片元与溶解边缘的边缘距离;基于所述变远距离、所述初始颜色、溶解边缘颜色确定出的溶解颜色,对未着色的所述贴花片元进行着色,得到所述贴花片元。
需要说明的是:上述实施例提供的在虚拟模型上贴花的装置,仅以上述各功能模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能模块完成,即将设备的内部结构划分成不同的功能模块,以完成以上描述的全部或者部分功能。另外,上述实施例提供的在虚拟模型上贴花的装置,与在虚拟模型上贴花的方法实施例属于同一构思,其具体实现过程详见方法实施例,这里不再赘述。
图26示出了本申请一个示例性实施例提供的电子设备1200的结构框图。该电子设备1200可以是便携式移动终端,比如:智能手机、平板电脑、mp3播放器(movingpictureexpertsgroupaudiolayeriii,动态影像专家压缩标准音频层面3)、mp4(movingpictureexpertsgroupaudiolayeriv,动态影像专家压缩标准音频层面4)播放器、笔记本电脑或台式电脑。电子设备1200还可能被称为用户设备、便携式终端、膝上型终端、台式终端等其他名称。
通常,电子设备1200包括有:处理器1201和存储器1202。
处理器1201可以包括一个或多个处理核心,比如4核心处理器、8核心处理器等。处理器1201可以采用dsp(digitalsignalprocessing,数字信号处理)、fpga(field-programmablegatearray,现场可编程门阵列)、pla(programmablelogicarray,可编程逻辑阵列)中的至少一种硬件形式来实现。处理器1201也可以包括主处理器和协处理器,主处理器是用于对在唤醒状态下的数据进行处理的处理器,也称cpu(centralprocessingunit,中央处理器);协处理器是用于对在待机状态下的数据进行处理的低功耗处理器。在一些实施例中,处理器1201可以集成有gpu(graphicsprocessingunit,图像处理器),gpu用于负责显示屏所需要显示的内容的渲染和绘制。一些实施例中,处理器1201还可以包括ai(artificialintelligence,人工智能)处理器,该ai处理器用于处理有关机器学习的计算操作。
存储器1202可以包括一个或多个计算机可读存储介质,该计算机可读存储介质可以是非暂态的。存储器1202还可包括高速随机存取存储器,以及非易失性存储器,比如一个或多个磁盘存储设备、闪存存储设备。在一些实施例中,存储器1202中的非暂态的计算机可读存储介质用于存储至少一个指令,该至少一个指令用于被处理器1201所执行以实现本申请中方法实施例提供的在虚拟模型上贴花的方法。
在一些实施例中,电子设备1200还可选包括有:外围设备接口1203和至少一个外围设备。处理器1201、存储器1202和外围设备接口1203之间可以通过总线或信号线相连。各个外围设备可以通过总线、信号线或电路板与外围设备接口1203相连。具体地,外围设备包括:射频电路1204、显示屏1205、摄像头组件1206、音频电路1207、定位组件1208和电源1209中的至少一种。
外围设备接口1203可被用于将i/o(input/output,输入/输出)相关的至少一个外围设备连接到处理器1201和存储器1202。在一些实施例中,处理器1201、存储器1202和外围设备接口1203被集成在同一芯片或电路板上;在一些其他实施例中,处理器1201、存储器1202和外围设备接口1203中的任意一个或两个可以在单独的芯片或电路板上实现,本实施例对此不加以限定。
射频电路1204用于接收和发射rf(radiofrequency,射频)信号,也称电磁信号。射频电路1204通过电磁信号与通信网络以及其他通信设备进行通信。射频电路1204将电信号转换为电磁信号进行发送,或者,将接收到的电磁信号转换为电信号。可选地,射频电路1204包括:天线系统、rf收发器、一个或多个放大器、调谐器、振荡器、数字信号处理器、编解码芯片组、用户身份模块卡等等。射频电路1204可以通过至少一种无线通信协议来与其它终端进行通信。该无线通信协议包括但不限于:万维网、城域网、内联网、各代移动通信网络(2g、3g、4g及5g)、无线局域网和/或wifi(wirelessfidelity,无线保真)网络。在一些实施例中,射频电路1204还可以包括nfc(nearfieldcommunication,近距离无线通信)有关的电路,本申请对此不加以限定。
显示屏1205用于显示ui(userinterface,用户界面)。该ui可以包括图形、文本、图标、视频及其它们的任意组合。当显示屏1205是触摸显示屏时,显示屏1205还具有采集在显示屏1205的表面或表面上方的触摸信号的能力。该触摸信号可以作为控制信号输入至处理器1201进行处理。此时,显示屏1205还可以用于提供虚拟按钮和/或虚拟键盘,也称软按钮和/或软键盘。在一些实施例中,显示屏1205可以为一个,设置在电子设备1200的前面板;在另一些实施例中,显示屏1205可以为至少两个,分别设置在电子设备1200的不同表面或呈折叠设计;在另一些实施例中,显示屏1205可以是柔性显示屏,设置在电子设备1200的弯曲表面上或折叠面上。甚至,显示屏1205还可以设置成非矩形的不规则图形,也即异形屏。显示屏1205可以采用lcd(liquidcrystaldisplay,液晶显示屏)、oled(organiclight-emittingdiode,有机发光二极管)等材质制备。
摄像头组件1206用于采集图像或视频。可选地,摄像头组件1206包括前置摄像头和后置摄像头。通常,前置摄像头设置在终端的前面板,后置摄像头设置在终端的背面。在一些实施例中,后置摄像头为至少两个,分别为主摄像头、景深摄像头、广角摄像头、长焦摄像头中的任意一种,以实现主摄像头和景深摄像头融合实现背景虚化功能、主摄像头和广角摄像头融合实现全景拍摄以及vr(virtualreality,虚拟现实)拍摄功能或者其它融合拍摄功能。在一些实施例中,摄像头组件1206还可以包括闪光灯。闪光灯可以是单色温闪光灯,也可以是双色温闪光灯。双色温闪光灯是指暖光闪光灯和冷光闪光灯的组合,可以用于不同色温下的光线补偿。
音频电路1207可以包括麦克风和扬声器。麦克风用于采集用户及环境的声波,并将声波转换为电信号输入至处理器1201进行处理,或者输入至射频电路1204以实现语音通信。出于立体声采集或降噪的目的,麦克风可以为多个,分别设置在电子设备1200的不同部位。麦克风还可以是阵列麦克风或全向采集型麦克风。扬声器则用于将来自处理器1201或射频电路1204的电信号转换为声波。扬声器可以是传统的薄膜扬声器,也可以是压电陶瓷扬声器。当扬声器是压电陶瓷扬声器时,不仅可以将电信号转换为人类可听见的声波,也可以将电信号转换为人类听不见的声波以进行测距等用途。在一些实施例中,音频电路1207还可以包括耳机插孔。
定位组件1208用于定位电子设备1200的当前地理位置,以实现导航或lbs(locationbasedservice,基于位置的服务)。定位组件1208可以是基于美国的gps(globalpositioningsystem,全球定位系统)、中国的北斗系统或俄罗斯的伽利略系统的定位组件。
电源1209用于为电子设备1200中的各个组件进行供电。电源1209可以是交流电、直流电、一次性电池或可充电电池。当电源1209包括可充电电池时,该可充电电池可以是有线充电电池或无线充电电池。有线充电电池是通过有线线路充电的电池,无线充电电池是通过无线线圈充电的电池。该可充电电池还可以用于支持快充技术。
在一些实施例中,电子设备1200还包括有一个或多个传感器1210。该一个或多个传感器1210包括但不限于:加速度传感器1211、陀螺仪传感器1212、压力传感器1213、指纹传感器1214、光学传感器1215以及接近传感器1216。
加速度传感器1211可以检测以电子设备1200建立的坐标系的三个坐标轴上的加速度大小。比如,加速度传感器1211可以用于检测重力加速度在三个坐标轴上的分量。处理器1201可以根据加速度传感器1211采集的重力加速度信号,控制显示屏1205以横向视图或纵向视图进行用户界面的显示。加速度传感器1211还可以用于游戏或者用户的运动数据的采集。
陀螺仪传感器1212可以检测电子设备1200的机体方向及转动角度,陀螺仪传感器1212可以与加速度传感器1211协同采集用户对电子设备1200的3d动作。处理器1201根据陀螺仪传感器1212采集的数据,可以实现如下功能:动作感应(比如根据用户的倾斜操作来改变ui)、拍摄时的图像稳定、游戏控制以及惯性导航。
压力传感器1213可以设置在电子设备1200的侧边框和/或显示屏1205的下层。当压力传感器1213设置在电子设备1200的侧边框时,可以检测用户对电子设备1200的握持信号,由处理器1201根据压力传感器1213采集的握持信号进行左右手识别或快捷操作。当压力传感器1213设置在显示屏1205的下层时,由处理器1201根据用户对显示屏1205的压力操作,实现对ui界面上的可操作性控件进行控制。可操作性控件包括按钮控件、滚动条控件、图标控件、菜单控件中的至少一种。
指纹传感器1214用于采集用户的指纹,由处理器1201根据指纹传感器1214采集到的指纹识别用户的身份,或者,由指纹传感器1214根据采集到的指纹识别用户的身份。在识别出用户的身份为可信身份时,由处理器1201授权该用户执行相关的敏感操作,该敏感操作包括解锁屏幕、查看加密信息、下载软件、支付及更改设置等。指纹传感器1214可以被设置在电子设备1200的正面、背面或侧面。当电子设备1200上设置有物理按键或厂商logo时,指纹传感器1214可以与物理按键或厂商logo集成在一起。
光学传感器1215用于采集环境光强度。在一个实施例中,处理器1201可以根据光学传感器1215采集的环境光强度,控制显示屏1205的显示亮度。具体地,当环境光强度较高时,调高显示屏1205的显示亮度;当环境光强度较低时,调低显示屏1205的显示亮度。在另一个实施例中,处理器1201还可以根据光学传感器1215采集的环境光强度,动态调整摄像头组件1206的拍摄参数。
接近传感器1216,也称距离传感器,通常设置在电子设备1200的前面板。接近传感器1216用于采集用户与电子设备1200的正面之间的距离。在一个实施例中,当接近传感器1216检测到用户与电子设备1200的正面之间的距离逐渐变小时,由处理器1201控制显示屏1205从亮屏状态切换为息屏状态;当接近传感器1216检测到用户与电子设备1200的正面之间的距离逐渐变大时,由处理器1201控制显示屏1205从息屏状态切换为亮屏状态。
本领域技术人员可以理解,图26中示出的结构并不构成对电子设备1200的限定,可以包括比图示更多或更少的组件,或者组合某些组件,或者采用不同的组件布置。
本申请的实施例还提供了一种计算机设备,该计算机设备包括处理器和存储器,该存储器中存储有至少一条指令、至少一段程序、代码集或指令集,至少一条指令、至少一段程序、代码集或指令集由处理器加载并执行以实现上述各方法实施例提供的在虚拟模型上贴花的方法。
本申请的实施例还提供了一种计算机可读存储介质,该计算机可读存储介质上存储有至少一条指令、至少一段程序、代码集或指令集,至少一条指令、至少一段程序、代码集或指令集由处理器加载并执行,以实现上述各方法实施例提供的在虚拟模型上贴花的方法。
本申请的实施例还提供了一种计算机程序产品或计算机程序,该计算机程序产品或计算机程序包括计算机指令,该计算机指令存储在计算机可读存储介质中。计算机设备的处理器从计算机可读存储介质读取该计算机指令,处理器执行该计算机指令,使得该计算机设备执行上述实施例中任一所述的在虚拟模型上贴花的方法。
可选地,该计算机可读存储介质可以包括:只读存储器(rom,readonlymemory)、随机存取记忆体(ram,randomaccessmemory)、固态硬盘(ssd,solidstatedrives)或光盘等。其中,随机存取记忆体可以包括电阻式随机存取记忆体(reram,resistancerandomaccessmemory)和动态随机存取存储器(dram,dynamicrandomaccessmemory)。上述本申请实施例序号仅仅为了描述,不代表实施例的优劣。
本领域普通技术人员可以理解实现上述实施例的全部或部分步骤可以通过硬件来完成,也可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读存储介质中,上述提到的存储介质可以是只读存储器,磁盘或光盘等。
以上所述仅为本申请的可选实施例,并不用以限制本申请,凡在本申请的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。