1.本发明涉及游戏技术领域,尤其是涉及一种云雾生成方法、装置及电子设备。
背景技术:2.随着手游市场的不断成熟,对于手游的开发要求不断明确,要求在性能消耗较小的同时满足精美的制作效果,在一些游戏场景中通常需要有云雾渲染效果,相关技术中,可以基于视差映射或基于3dtexture制作体积云雾,然而,视差映射方法在高度图变化急剧的情况下容易产生错误的结果,同时只能够在小范围内保证效果,当视角灵活移动或者与平面角度较近的时候很难有比较好的效果。而基于3dtexture的方案则需要多pass渲染,同时更新效果时需要生成采样新的3dtexture,性能开销大。因此,目前的云雾解决方案只能在选择固定视角减少开销或者是提高性能消耗和技术要求之间选择,很难匹配灵活的云雾生成需求。
技术实现要素:3.本发明的目的在于提供一种云雾生成方法、装置及电子设备,以提供灵活的云雾解决方案,匹配灵活的云雾渲染需求。
4.本发明提供的一种云雾生成方法,方法包括:获取预设的平面模型和2d噪声贴图;其中,平面模型中预设有多个顶点;2d噪声贴图为每个像素点的灰度值在0-1范围的灰度图像;获取平面模型的每个顶点在对应纹理坐标系中的纹理坐标;根据每个顶点的纹理坐标,对2d噪声贴图进行采样,得到每个顶点对应的第一灰度值,将每个顶点对应的第一灰度值确定为每个顶点对应的初始顶点偏移量;获取平面模型对应的每个顶点随时间变化的偏移因子;其中,偏移因子为基于预设的云雾运动速度参数的变量;基于初始顶点偏移量和偏移因子,确定每个顶点随时间变化的第一顶点偏移量;基于第一顶点偏移量渲染生成平面模型对应的目标云雾。
5.本发明提供的一种云雾生成装置,装置包括:第一获取模块,用于获取预设的平面模型和2d噪声贴图;其中,平面模型中预设有多个顶点;2d噪声贴图为每个像素点的灰度值在0-1范围的灰度图像;第二获取模块,用于获取平面模型的每个顶点在对应纹理坐标系中的纹理坐标;第一确定模块,用于根据每个顶点的纹理坐标,对2d噪声贴图进行采样,得到每个顶点对应的第一灰度值,将每个顶点对应的第一灰度值确定为每个顶点对应的初始顶点偏移量;第四获取模块,用于获取平面模型对应的每个顶点随时间变化的偏移因子;其中,偏移因子为基于预设的云雾运动速度参数的变量;第二确定模块,用于基于初始顶点偏移量和偏移因子,确定每个顶点随时间变化的第一顶点偏移量;第三确定模块,用于基于第一顶点偏移量渲染生成平面模型对应的目标云雾。
6.本发明提供的一种电子设备,包括处理器和存储器,存储器存储有能够被处理器执行的机器可执行指令,处理器执行机器可执行指令以实现上述任一项的云雾生成方法。
7.本发明提供的一种机器可读存储介质,机器可读存储介质存储有机器可执行指
令,机器可执行指令在被处理器调用和执行时,机器可执行指令促使处理器实现上述任一项的云雾生成方法。
8.本发明提供的云雾生成方法、装置及电子设备,首先获取预设的平面模型、2d噪声贴图,以及平面模型的每个顶点在对应纹理坐标系中的纹理坐标;根据每个顶点的纹理坐标,对2d噪声贴图进行采样,得到每个顶点对应的第一灰度值,将每个顶点对应的第一灰度值确定为每个顶点对应的初始顶点偏移量;获取平面模型对应的每个顶点随时间变化的偏移因子;基于初始顶点偏移量和偏移因子,确定每个顶点随时间变化的第一顶点偏移量;基于第一顶点偏移量渲染生成平面模型对应的目标云雾。该方式通过对2d噪声贴图采样,就可以确定平面模型中每个顶点对应的初始顶点偏移量,再结合随时间变化的偏移因子确定第一顶点偏移量,由于每个顶点的第一顶点偏移量随时间变化,从而基于第一顶点偏移量可以得到更加动态、灵活的目标云雾,以匹配灵活的云雾生成需求。
附图说明
9.为了更清楚地说明本发明具体实施方式或现有技术中的技术方案,下面将对具体实施方式或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施方式,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
10.图1为本发明实施例提供的一种云雾生成方法的流程图;
11.图2为本发明实施例提供的一种云雾生成方法的流程图;
12.图3为本发明实施例提供的一种蓬松前的云雾效果示意图;
13.图4为本发明实施例提供的一种蓬松后的云雾效果示意图;
14.图5为本发明实施例提供的一种表面结果示意图;
15.图6为本发明实施例提供的一种表面结果示意图;
16.图7为本发明实施例提供的一种云雾生成方法的流程图;
17.图8为本发明实施例提供的一种云雾效果示意图;
18.图9为本发明实施例提供的一种云雾生成方法的流程图;
19.图10为本发明实施例提供的一种云雾效果示意图;
20.图11为本发明实施例提供的一种云雾效果示意图;
21.图12为本发明实施例提供的一种云雾效果示意图;
22.图13为本发明实施例提供的一种真实温泉表面的云雾示意图;
23.图14为本发明实施例提供的一种云雾生成装置的结构示意图;
24.图15为本发明实施例提供的一种电子设备的结构示意图。
具体实施方式
25.下面将结合实施例对本发明的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
26.在本公开其中一种实施例中的云雾生成方法可以运行于本地终端设备或者是服
务器。当云雾生成方法运行于服务器时,该方法则可以基于云交互系统来实现与执行,其中,云交互系统包括服务器和客户端设备。
27.在一可选的实施方式中,云交互系统下可以运行各种云应用,例如:云游戏。以云游戏为例,云游戏是指以云计算为基础的游戏方式。在云游戏的运行模式下,游戏程序的运行主体和游戏画面呈现主体是分离的,云雾生成方法的储存与运行是在云游戏服务器上完成的,客户端设备的作用用于数据的接收、发送以及游戏画面的呈现,举例而言,客户端设备可以是靠近用户侧的具有数据传输功能的显示设备,如,移动终端、电视机、计算机、掌上电脑等;但是进行信息处理的为云端的云游戏服务器。在进行游戏时,玩家操作客户端设备向云游戏服务器发送操作指令,云游戏服务器根据操作指令运行游戏,将游戏画面等数据进行编码压缩,通过网络返回客户端设备,最后,通过客户端设备进行解码并输出游戏画面。
28.在一可选的实施方式中,以游戏为例,本地终端设备存储有游戏程序并用于呈现游戏画面。本地终端设备用于通过图形用户界面与玩家进行交互,即,常规的通过电子设备下载安装游戏程序并运行。该本地终端设备将图形用户界面提供给玩家的方式可以包括多种,例如,可以渲染显示在终端的显示屏上,或者,通过全息投影提供给玩家。举例而言,本地终端设备可以包括显示屏和处理器,该显示屏用于呈现图形用户界面,该图形用户界面包括游戏画面,该处理器用于运行该游戏、生成图形用户界面以及控制图形用户界面在显示屏上的显示。
29.在一种可能的实施方式中,本技术实施例提供了一种云雾生成方法,通过终端设备提供图形用户界面,其中,终端设备可以是前述提到的本地终端设备,也可以是前述提到的云交互系统中的客户端设备。
30.随着手游市场的不断成熟,对于手游的开发要求不断明确,在性能消耗小的情况下同时需要满足效果精美,应用场景广泛。在一些游戏场景中通常需要有云雾渲染效果,相关技术中,可以基于视差映射或基于3dtexture制作体积云雾,下面对这两种方式分别进行介绍:
31.视差映射即视差贴图,是在视频游戏这类三维渲染应用中使用的一种改进的凹凸贴图或者法线贴图技术,基于视差映射方式的具体实现方式如下:通过一张高度贴图,读取对应纹理坐标位置t0位置的高度h(t0),其中,高度贴图通常为一张灰度图像,存储的数值可以用来表示顶点高度的矩形数组,一般情况,视差映射会把高度贴图中的值当深度来用,这里需要作为高度使用,将云层凸起模拟出来,计算摄像机向量v和高度贴图定义出来的高度表面的交点,对应原本纹理坐标进行偏移。想要达到比较好的效果,偏移方法包括:
32.(1)带视差上限:沿着摄像机向量v的x和y方向进行偏移,避免在摄像机向量v和法线向量n夹角太大时的错误结果;其中,法线向量是指始终垂直于某平面的直线。在几何学中,法线指平面上垂直于曲线在某点的切线的一条线。
33.(2)陡峭视差映射(steep parallax mapping,spm):把表面的高度切分成等距的若干层。然后从最底端的一层开始采样高度贴图,每一次会沿着v的方向偏移纹理坐标。如果点已经高于了最高表面,停止检查并且使用最后一次采样的纹理坐标作为结果。这样能得到更精确的纹理偏移。
34.(3)浮雕视差映射(relief parallax mapping,rpm):在摄像机向量v与高度贴图
相交的上下取最近的两个高度层,可以用这两个高度层对应的纹理偏移坐标用二分法来改进结果。
35.3dtexture也即三维纹理,基于3dtexture方式的具体实现方式如下:在unity shader中每一个pass表示渲染一层,每一层使顶点位置沿法线进行偏移,多层的效果需要用当前层作为偏移系数,使pass越靠后的层,向外偏移的越多。使用多个pass渲染同时采样3dtexture的噪声贴图作为不同层的透明度,进行透明度扰动。其中,shader可以理解为材质编辑器,着色器,用来渲染3d图形的一种技术;一个pass简单来说就是走完图形渲染的流程,多pass就是渲染一帧需要多个pass配合来完成最终的效果
36.目前技术的方案中,视差映射方法在高度图变化急剧的情况下容易产生错误的结果,同时只能够在小范围内保证效果,当视角灵活移动或者与平面角度较近的时候很难有比较好的表现。而基于3dtexture的方案则需要多pass渲染,同时更新效果时需要生成采样新的3dtexture,性能开销大。基于此,本发明实施例提供了一种云雾生成方法、装置及电子设备,该技术可以应用于需要在游戏场景中渲染云雾的场景中。
37.为便于对本实施例进行理解,首先对本公开实施例所公开的一种云雾生成方法,如图1所示,方法包括:
38.步骤s102,获取预设的平面模型和2d噪声贴图;其中,平面模型中预设有多个顶点;2d噪声贴图为每个像素点的灰度值在0-1范围的灰度图像。
39.本公开实施例中的云雾生成方法可以采用编辑器版本为2021.3.0f1版本的unity(一款引擎,游戏开发工具),渲染模式为urp(渲染管线的一种,是基于unity游戏引擎的可编程渲染管线机制),当然也可以选择其他版本,在此不作限定;首先需要创建一个平面模型,并赋予本实施例的材质shader,该平面模型的形状可以根据实际需求设置,该平面模型中通常预设有多个顶点,比如,可以对平面模型平均划分,绘制多条横线和多条竖线,多个横线和多个竖线所形成的多个交点作为顶点;上述2d噪声贴图通常是任意的并没有那么锐利的噪声图,考虑到云雾相对更圆滑一些,因此,可以使用高斯模糊的柏林噪声等,2d噪声贴图中,每个像素点的灰度值在0-1之间,其中,0为黑色,1为白色。
40.步骤s104,获取平面模型的每个顶点在对应纹理坐标系中的纹理坐标。
41.上述纹理坐标可以以uv表示,通常u代表横向坐标上的分布,v代表纵向坐标上的分布,通过纹理坐标可以将2d噪声贴图上的每一个点精确对应到平面模型的表面。在实际实现时,可以获取平面模型对应的纹理坐标系,并确定出每个顶点在纹理坐标系中的纹理坐标,其中,纹理坐标的范围通常是0到1之间。
42.步骤s106,根据每个顶点的纹理坐标,对2d噪声贴图进行采样,得到每个顶点对应的第一灰度值,将每个顶点对应的第一灰度值确定为每个顶点对应的初始顶点偏移量。
43.本实施例通过采样2d噪声贴图来获取每个顶点不同的偏移量,具体的,可以根据每个顶点的纹理坐标对2d噪声贴图进行采样,可以得到每个顶点对应位置处的第一灰度值,由于2d噪声贴图通常是任意噪声图,因此,每个顶点对应的第一灰度值通常是不相同的,可以将每个第一灰度值确定为相应顶点对应的初始顶点偏移量;该固定的顶点偏移值指不随时间变化偏移的uv对2d噪声贴图进行采样,仅仅用原本的uv进行采样。
44.步骤s108,获取平面模型对应的每个顶点随时间变化的偏移因子;其中,偏移因子为基于预设的云雾运动速度参数的变量。
45.为了得到更加动态灵活的云雾,使云雾能随时间变化变换形态,可以设定一偏移因子,该偏移因子与时间相关,且与用户设定的速度参数_speed相关,其中,该速度参数_speed通常是用户设定的云雾运动速度参数。
46.步骤s110,基于初始顶点偏移量和偏移因子,确定每个顶点随时间变化的第一顶点偏移量。
47.为了得到形态更加丰富、灵活的云雾,在得到每个顶点分别对应的初始顶点偏移量和偏移因子后,可以对相应的初始顶点偏移量和偏移因子按预设方式计算,比如,取平均值或按预设权重加权处理等,以得到各自对应的随时间变化的第一顶点偏移量。
48.步骤s112,基于第一顶点偏移量渲染生成平面模型对应的目标云雾。
49.可以根据每个顶点随时间变化的第一顶点偏移量,渲染生成平面模型对应的目标云雾,通常情况下,由于上述偏移因子与时间有关,从而每个顶点在不同的时间点通常对应有不同的第一顶点偏移量,因此,可以在每个时间点,按照每个顶点分别对应的第一顶点偏移量,确定每个顶点的位置,进而渲染出该时间点对应的目标云雾,即目标云雾通常会随时间变化展现出不同的形态。
50.上述云雾生成方法,首先获取预设的平面模型、2d噪声贴图,以及平面模型的每个顶点在对应纹理坐标系中的纹理坐标;根据每个顶点的纹理坐标,对2d噪声贴图进行采样,得到每个顶点对应的第一灰度值,将每个顶点对应的第一灰度值确定为每个顶点对应的初始顶点偏移量;获取平面模型对应的每个顶点随时间变化的偏移因子;基于初始顶点偏移量和偏移因子,确定每个顶点随时间变化的第一顶点偏移量;基于第一顶点偏移量渲染生成平面模型对应的目标云雾。该方式通过对2d噪声贴图采样,就可以确定平面模型中每个顶点对应的初始顶点偏移量,再结合随时间变化的偏移因子确定第一顶点偏移量,由于每个顶点的第一顶点偏移量随时间变化,从而基于第一顶点偏移量可以得到更加动态、灵活的目标云雾,以匹配灵活的云雾生成需求。
51.在一可选的实施方式中,该方法在上述实施例方法的基础上实现;该方法重点描述基于初始顶点偏移量和偏移因子,确定每个顶点随时间变化的第一顶点偏移量的具体过程,具体对应下述步骤s210至步骤s216,如图2所示,该方法包括如下步骤:
52.步骤s202,获取预设的平面模型和2d噪声贴图;其中,平面模型中预设有多个顶点;2d噪声贴图为每个像素点的灰度值在0-1范围的灰度图像。
53.步骤s204,获取平面模型的每个顶点在对应纹理坐标系中的纹理坐标。
54.步骤s206,根据每个顶点的纹理坐标,对2d噪声贴图进行采样,得到每个顶点对应的第一灰度值,将每个顶点对应的第一灰度值确定为每个顶点对应的初始顶点偏移量。
55.步骤s208,获取平面模型对应的每个顶点随时间变化的偏移因子;其中,偏移因子为基于预设的云雾运动速度参数的变量。
56.步骤s210,针对每个时间点的每个顶点,计算该顶点对应的初始顶点偏移量与该时间点对应的偏移因子的和,得到偏移量加和结果。
57.本实施例中,可以通过采样2d噪声贴图来获取每个顶点不同的偏移量加和结果,通过在顶点着色器中进行顶点偏移,实现云雾翻涌的效果,其中,顶点着色器通常是指一组指令代码,在顶点被渲染的时候被执行;顶点偏移可以理解为顶点在顶点着色器中偏离原本模型中记录的位置到新的位置。即可以通过简单的2d噪声贴图控制灵活的云雾形变。上
述偏移因子可以按以下方式确定:将时间系数_time.x(_time(t/20,t,2t,3t),t为自场景加载开始所经过的时间,_time.x则为t/20)与用户可调的速度参数_speed相乘,得到随着时间流逝对纹理坐标进行平移的结果,采样得到平滑变换的顶点偏移;其中,t/20是unity内置time.xyzw中的time.x,是time.xyzw中最小的一项。由于云的运动缓慢,所以使用了最小的尺度,但是也乘以了_speed属性,可以在外界调整运动速度;上述速度参数_speed即为用户设定的云雾运动速度参数;通过将t/20与速度参数_speed相乘,可以用于控制云雾运动的速度。针对每个时间点的每个顶点,将该顶点对应的初始顶点偏移量加上其对应的随时间变化的偏移因子,可以模拟云雾不同层次的变化;该方式可以在unity中实现简单、灵活、性价比更高的表面体积云雾方案。
58.步骤s212,对偏移量加和结果求平均,得到平均值,将平均值作为该顶点在该时间点对应的第一平均偏移量。
59.步骤s214,通过预设第一函数将第一平均偏移量控制在预设第一范围内,得到该顶点在该时间点对应的第二平均偏移量。
60.上述预设第一函数可以是saturate函数,saturate(x)函数可以将大于1的x值设为等于1,将小于0的x设为等于0;上述第一范围通常是[0,1]范围;在实际实现时,当获取到上述偏移量加和结果后,可以计算平均值,得到第一平均偏移量,并用saturate函数将第一平均偏移量控制在[0,1]范围内,得到每个顶点在每个时间点对应的第二平均偏移量,具体代码实现可以如下:
[0061][0062]
其中,in.uv表示原始的uv纹理坐标;noisetex表示2d噪声贴图;transform_tex表示从_noisetex这张2d噪声贴图中获取缩放与偏移贴图的数值,默认缩放是1,偏移是0;out.clouduv01表示用时间系数与速度参数对uv纹理坐标进行偏移,并输出偏移后的纹理坐标;_time.x表示时间系数;_speed表示速度参数;out.clouduv02表示输出一个没有经历过偏移的初始的uv纹理坐标;tex2dlod表示贴图采样函数;out.noisepos.x表示输出noisepos向量的第一个浮点数;out.noisepos.x就是用out.clouduv01这个偏移后的uv纹理坐标去采样_noisetex这张2d噪声贴图所得;float4表示一个由4个浮点数(float)组成的四维向量,这四维可以用xyzw或者rgba表示;r表示贴图采样后获得的数值的第一个浮点数,也可以用x表示;out.noisepos.y表示输出noisepos向量的第二个浮点数;noisecount表示第一平均偏移量;saturate()函数用于可以将大于1的值设为等于1,将小于0的值设为等于0
。
[0063]
步骤s216,基于该顶点在每个时间点对应的每个第二平均偏移量,确定该顶点随时间变化的第一顶点偏移量。
[0064]
该步骤s216具体可以通过以下步骤一至步骤三实现:
[0065]
步骤一,通过预设第二函数和预设幂指数,调整每个第二平均偏移量,得到该顶点在每个时间点对应的调整后的第三平均偏移量。
[0066]
上述第二函数可以是pow函数,该pow函数的表达式为pow(x,y)=xy;可以使用pow函数对每个顶点在每个时间点的第二平均偏移量进行调整,具体可以将第二平均偏移量作为底数,外界暴露的可调整的_fluffy作为幂指数,得到各自对应的调整后的第三平均偏移量,以实现云雾的蓬松度,如图3所示的一种蓬松前的云雾效果示意图,以及图4所示的一种蓬松后的云雾效果示意图;具体代码实现可以如下:
[0067]
nosiecount=pow(noisecount,_fluffy)。
[0068]
其中,noisecount表示第一平均偏移量;pow()函数用于求解noisecount的_fluffy次幂;_fluffy表示幂指数
。
[0069]
步骤二,将第三平均偏移量从第一范围映射至第二范围,并对映射结果取绝对值,得到该顶点在每个时间点对应的第四平均偏移量。
[0070]
上述第二范围通常是比第一范围的范围区间更大的范围;在实际实现时,可以使用remap函数将每个顶点在每个时间点的第三平均偏移量noisecount从[0,1]映射到更大的可自定义的新的范围[_shapeadjust1,_shapeadust2]得到类似如图5所示的一种表面结果示意图,再将结果取绝对值达到如图6所示的一种表面结果示意图,进而得到每个顶点在每个时间点对应的第四平均偏移量,通过该方式可以得到起伏更多的、更类似云的形状。其中,remap函数的函数形式为remap(x,t1,t2,s1,s2)返回值为(x-t1)/(t2-t1)*(s2-s1)+s1;用于将x从(t1,t2)范围中映射到(s1,s2)中。
[0071]
步骤三,通过预设第三函数将第四平均偏移量控制在第一范围内,得到该顶点随时间变化的第一顶点偏移量。
[0072]
上述第三函数可以是smoothstep函数;在实际实现时,为了防止顶点偏移的突变,使得云层足够光滑,可以使用smoothstep函数将上述每个顶点在每个时间点对应的第四平均偏移量重新控制在第一范围内,即在[0,1]范围内进行平滑。其中,smoothstep函数的函数形式为smoothstep(min,max,x):返回的值为-2*((x-min)/(max-min))3+3*((x-min)/(max-min))2;具体代码实现可以如下:
[0073]
noisecount=abs(remap(noisecount,0.0f,1.0f,_shapeadjust1,_shapeadjust2));
[0074]
noisecount=saturate(smoothstep(0.0f,1.0f,noisecount));
[0075]
其中,noisecount表示第一平均偏移量;abs()函数表示取绝对值;remap()函数表示将第一平均偏移量从[0,1]映射到更大的可自定义的新的范围[_shapeadjust1,_shapeadjust2];smoothstep()函数用来生成0到1的平滑过渡值。
[0076]
步骤s218,基于第一顶点偏移量渲染生成平面模型对应的目标云雾。
[0077]
上述云雾生成方法,针对每个时间点的每个顶点,计算该顶点对应的初始顶点偏移量与该时间点对应的偏移因子的和,得到偏移量加和结果。对偏移量加和结果求平均,得到平均值,将平均值作为该顶点在该时间点对应的第一平均偏移量。通过预设第一函数将第一平均偏移量控制在预设第一范围内,得到该顶点在该时间点对应的第二平均偏移量。基于该顶点在每个时间点对应的每个第二平均偏移量,确定该顶点随时间变化的第一顶点偏移量,进而确定每个时间点对应的目标云雾。该方式对每个时间点的每个顶点对应的初
始顶点偏移量与该时间点对应的偏移因子进行加和求平均计算,得到第一平均偏移量,通过对第一平均偏移量进行范围控制和范围调整,得到随时间变化的第一顶点偏移量,从而基于第一顶点偏移量可以得到更加动态、灵活的目标云雾,以匹配灵活的云雾生成需求。
[0078]
在一可选的实施方式中,该方法在上述实施例方法的基础上实现;该方法重点描述生成融合云雾的具体过程,如图7所示,该方法包括如下步骤:
[0079]
步骤s702,获取预设的平面模型和2d噪声贴图;其中,平面模型中预设有多个顶点;2d噪声贴图为每个像素点的灰度值在0-1范围的灰度图像。
[0080]
步骤s704,获取平面模型的每个顶点在对应纹理坐标系中的纹理坐标。
[0081]
步骤s706,根据每个顶点的纹理坐标,对2d噪声贴图进行采样,得到每个顶点对应的第一灰度值,将每个顶点对应的第一灰度值确定为每个顶点对应的初始顶点偏移量。
[0082]
步骤s708,获取平面模型对应的每个顶点随时间变化的偏移因子;其中,偏移因子为基于预设的云雾运动速度参数的变量。
[0083]
步骤s710,基于初始顶点偏移量和偏移因子,确定每个顶点随时间变化的第一顶点偏移量。
[0084]
步骤s712,基于第一顶点偏移量渲染生成平面模型对应的目标云雾。
[0085]
步骤s714,响应于针对2d噪声贴图的缩放指令,按预设缩放系数,缩放2d噪声贴图。
[0086]
步骤s716,根据每个顶点的纹理坐标,对缩放后的2d噪声贴图进行采样,得到每个顶点对应的第二灰度值。
[0087]
上述缩放系数也可以理解为缩放云雾的强度;为了模拟云雾有大块有细节的实际效果,可以对于上述2d噪声贴图进行重新采样,具体的,可以使用_basescale调整纹理的缩放来模拟缩放云的大小,具体可以按预设缩放系数放大或缩小2d噪声贴图,得到放大或缩小后的2d噪声贴图,再根据每个顶点的纹理坐标重新进行采样,由于2d噪声贴图已被放大或缩小,因此,每个顶点对应的第二灰度值通常与缩放2d噪声贴图之前采样得到的第一灰度值并不相同,该第二灰度值为对放大或缩小后的2d噪声贴图采样得到的[0,1]内的数值。
[0088]
步骤s718,将每个顶点对应的第二灰度值与缩放系数相乘,得到每个顶点的第二顶点偏移量;其中,每个顶点的第二顶点偏移量对应缩放云雾的偏移量;其中,缩放云雾基于第二顶点偏移量渲染生成。
[0089]
在得到上述每个顶点对应的第二灰度值后,可以将采样到的每个顶点的第二灰度值与缩放云雾的强度相乘,得到每个顶点的第二顶点偏移量,即缩放云雾的偏移量,具体为计算方式如下:缩放云雾的偏移量=noisebase(采样黑白噪声图得到的[0,1]内的数值)*_basestrength(缩放云雾的强度);上述缩放云雾可以基于第二顶点偏移量渲染生成,具体渲染过程可以参考上述渲染生成目标云雾的相关描述,在此不再赘述。
[0090]
步骤s720,对于每个时间点,均基于该时间点对应的每个顶点的第一顶点偏移量、每个第二顶点偏移量和缩放系数,计算该时间点对应的每个顶点的目标融合偏移量。
[0091]
该步骤s720具体可以通过以下步骤五至步骤八实现:
[0092]
步骤五,对于每个时间点的每个顶点,计算该顶点对应的第二顶点偏移量与第一顶点偏移量之和,得到第一加和结果。
[0093]
相对于缩放云雾来说,上述目标云雾对应为细节云雾;上述第二顶点偏移量对应
为缩放云雾的偏移量;上述第一顶点偏移量对应为细节云雾即上述目标云雾的偏移量;具体实现时,可以将每个时间点的每个顶点对应的第二顶点偏移量与相应的第一顶点偏移量相加,得到每个时间点的每个顶点对应的第一加和结果,该第一加和结果具体可以为(缩放云雾的偏移量+细节云雾的偏移量)。
[0094]
步骤六,计算缩放系数与预设固定值之和,得到第二加和结果。
[0095]
步骤七,将第一加和结果除以第二加和结果,得到第一计算结果。
[0096]
上述预设固定值具体可以为1,也可以根据实际需求选择其他固定值;如果预设固定值为1,则第二加和结果具体可以为(1+_basestrength),其中,_basestrength对应缩放系数,也即缩放云雾的强度;该第一计算结果具体可以为:第一计算结果=(缩放云雾的偏移量+细节云雾的偏移量)/(1+_basestrength)。
[0097]
步骤八,通过预设第一函数将第一计算结果控制在预设第一范围内,以得到该顶点对应的目标融合偏移量。
[0098]
上述预设第一函数可以是saturate函数,saturate(x)函数可以将大于1的x值设为等于1,将小于0的x设为等于0;上述第一范围通常是[0,1]范围;在实际实现时,在得到上述第一计算结果后,可以采用saturate函数将第一计算结果控制在[0,1]范围内,得到每个顶点在每个时间点的目标融合偏移量。
[0099]
步骤s722,基于该时间点对应的每个顶点的目标融合偏移量确定该时间点对应的融合云雾;其中,融合云雾为缩放云雾和该时间点对应的目标云雾的融合。
[0100]
在实际实现时,可以在每个时间点,按照每个顶点分别对应的目标融合偏移量,确定每个顶点的位置,进而渲染出该时间点对应的融合云雾,实现缩放云雾和细节云雾的吞并融合。如果缩放云雾直接叠加上细小的目标云雾会有单纯两者叠在一起的奇怪感,所以如果两者相加的值超过1以后就以1来代替,这样就可以让两者融合,融合效果更加自然;如图8所示的一种云雾效果示意图;具体代码实现可以如下:
[0101]
float2 baseuv=in.uv*_basescale+_time.x*_speed*0.5f;
[0102]
float noisebase=tex2diod(_noisetex,float4(baseuv,0,0)).r;
[0103]
noisecount=saturate((noisebase*_basestrength+noisecount)/(1+_basestrength));
[0104]
其中,baseuv表示一个新的uv纹理坐标,该纹理坐标由原始的纹理坐标in.uv计算而得(basescale是uv纹理坐标的缩放系数,还通过时间系数对uv纹理坐标做偏移);basestrength对应缩放系数(即缩放云雾的强度);noisebase表示用baseuv这个uv纹理坐标采样noisetexz这张2d噪声贴图所得的缩放云雾;noisetex表示2d噪声贴图;float4表示一个由4个浮点数(foat)组成的四维向量,这四维可以用xyzw或者rgba表示;r表示贴图采样后获得的数值的第一个浮点数,也可以用x表示。
[0105]
上述云雾生成方法,响应于针对2d噪声贴图的缩放指令,按预设缩放系数,缩放2d噪声贴图。根据每个顶点的纹理坐标,对缩放后的2d噪声贴图进行采样,得到每个顶点对应的第二灰度值。将每个顶点对应的第二灰度值与缩放系数相乘,得到每个顶点的第二顶点偏移量;其中,每个顶点的第二顶点偏移量对应缩放云雾的偏移量。对于每个时间点,均基于该时间点对应的每个顶点的第一顶点偏移量、每个第二顶点偏移量和缩放系数,计算该时间点对应的每个顶点的目标融合偏移量。基于该时间点对应的每个顶点的目标融合偏移
量确定该时间点对应的融合云雾;其中,融合云雾为缩放云雾和该时间点对应的目标云雾的融合。该方式通过对2d噪声贴图进行缩放并重新采样,以得到缩放云雾对应的每个顶点的第二顶点偏移量,结合目标云雾对应的每个顶点的第一顶点偏移量和缩放系数,可以确定目标融合偏移量,按照该目标融合偏移量确定的融合云雾,实现了缩放云雾可以吞并掉之前形成的细节的目标云雾,而不是在缩放云雾上直接叠加细小云雾,从而实现缩放云雾和细节云雾的错落感。
[0106]
在一可选的实施方式中,该方法在上述实施例方法的基础上实现;该方法重点描述生成融合云雾的具体过程,如图9所示,该方法包括如下步骤:
[0107]
步骤s902,获取预设的平面模型和2d噪声贴图;其中,平面模型中预设有多个顶点;2d噪声贴图为每个像素点的灰度值在0-1范围的灰度图像。
[0108]
步骤s904,获取平面模型的每个顶点在对应纹理坐标系中的纹理坐标。
[0109]
步骤s906,根据每个顶点的纹理坐标,对2d噪声贴图进行采样,得到每个顶点对应的第一灰度值,将每个顶点对应的第一灰度值确定为每个顶点对应的初始顶点偏移量。
[0110]
步骤s908,获取平面模型对应的每个顶点随时间变化的偏移因子;其中,偏移因子为基于预设的云雾运动速度参数的变量。
[0111]
步骤s910,基于初始顶点偏移量和偏移因子,确定每个顶点随时间变化的第一顶点偏移量。
[0112]
步骤s912,对于每个时间点,将该时间点对应的每个顶点的第一顶点偏移量进行调整,得到每个顶点对应的目标顶点偏移量;其中,距离平面模型中心越远的顶点,其对应的向上的目标顶点偏移量越大。
[0113]
在得到上述第一顶点偏移量后,可以使用自定义高度参数_height控制顶点偏移量的最后结果,对每个时间点所对应的每个顶点的第一顶点偏移量进行整体调整,将整体深度调深一些,形成比较深的碗装形状,如图10所示的一种云雾效果示意图;可以通过distance函数判断顶点与平面模型中心的距离,实现离中心点越远向上偏移量愈多的碗状效果,使得相机在平面内移动不易看到平面外的东西,提高灵活性;其中,distance的函数形式为:distance(float2(x1,y1),float2(x2,y2)),计算点(x1,y1)和点(x2,y2)两个点之间的距离;具体代码实现可以如下:
[0114]
out.positioncs.y-=noisecount*_height;
[0115]
out.positioncs.y-=distance(float2(0,0),out.positionws.xz)*_dcurvatureradius;
[0116]
其中,out.positioncs表示最终输出的裁剪空间下的顶点位置,out.positioncs.y即表示这顶点位置的第二个浮点数;noisecount表示第一顶点偏移量;_height为自定义高度参数;out.positionws表示模型顶点在世界空间下的位置,out.positionws.xz表示这个位置的第一、三浮点数;distance为计算(0,0)到out.positionws.xz的距离;_dcurvatureradius表示通过distance函数判断顶点与平面模型中心的距离,实现离中心点越远向上偏移量愈多的碗状效果。
[0117]
步骤s914,基于每个顶点对应的目标顶点偏移量,确定该时间点对应的目标云雾。
[0118]
该步骤s914具体可以通过以下步骤十至步骤十四实现:
[0119]
步骤十,对于每个时间点,基于该时间点对应的每个顶点的目标顶点偏移量,确定
该时间点对应的初始云雾。
[0120]
上述初始云雾可以理解为已具有云雾形态,但是还未设置材质效果的云雾,可以在片元着色器中对颜色和透明度进行设置,以模拟实现效果;其中,片元着色器通常指一组代码指令,可以用来进行光照计算等一系列着色计算。
[0121]
步骤十一,通过预设第一函数将该时间点对应的每个顶点的目标顶点偏移量控制在预设第一范围内,得到每个顶点的第三顶点偏移量。
[0122]
步骤十二,基于每个顶点的第三顶点偏移量确定透明度系数;其中,第三顶点偏移量越大,透明度系数越高。
[0123]
步骤十三,基于每个顶点的透明度系数,调整初始云雾的透明度,得到具有渐变色的初始云雾。
[0124]
上述第一函数可以是saturate函数,saturate(x)函数可以将大于1的x值设为等于1,将小于0的x设为等于0;在实际实现时,片元着色器可以获取顶点着色器中的每个顶点在每个时间点的目标顶点偏移量,并将目标偏移量用saturate函数夹逼到[0,1]范围内作为colormask。因为目标顶点偏移量大的位置意味着越凸起,目标顶点偏移量越小的位置意味着越凹陷,通过这点来绘制初始云雾的从顶端到凹陷的渐变色,通常目标顶点偏移量越大的位置颜色越浅,即透明度系数越高;偏移量越小的位置颜色越深,即透明度系数越低。代码实现可以如下:
[0125]
float colormask=saturate(in.noisepos.z);
[0126]
float4 col=(_topcolor*colormask)+(_bottomcolor*(1-colormask));
[0127]
其中,colormask表示将in.noisepos.z数值归一化处理后得到的数值(即saturate(x)函数,可以将大于1的x值设为等于1,将小于0的x设为等于0);in.noisepos.z表示目标顶点偏移量;col表示最终输出颜色,目前col得到的是初始云雾的从顶端到凹陷的渐变色;_topcolor表示顶端颜色;_bottomcolor表示凹陷颜色。
[0128]
步骤十四,对具有渐变色的初始云雾进行光照着色,得到该时间点对应的目标云雾。
[0129]
该步骤十四具体可以包括以下步骤a至步骤e实现:
[0130]
步骤a,对具有渐变色的初始云雾进行光照着色,得到着色后的初始云雾。
[0131]
可以通过菲涅尔实现在实现远处云层被阳光镀上颜色的效果,其中,菲涅尔效应也可以称为菲涅尔反射,普通的反射看上去比较粗略,菲涅尔的效果会让物体表面看的更有质感,并且创建一种边缘光照的效果,如图11所示的一种云雾效果示意图。具体可以通过以下代码实现,可以理解,随着法线和视角方向夹角的增大,得到的结果也是越来越大的,这样可以得到一个渐变的材质,同时使用pow函数控制渐变的放大和缩小。
[0132][0133]
其中,half3表示三维浮点向量;n表示法线;normalize代表把一个多维向量的每
一个浮点的数值,限制在0-1之间,大于1取值1,小于0取值0;in.normalws表示获取模型的法线;v表示视角方向;in.viewdirws表示获取视角方向;ndotv表示法线与视角方向做一个点积运算(点积即dot),再做一个归一化saturate的处理,得到一个初始菲涅尔效应的计算结果;fresnel表示菲涅尔效应的计算结果,即上文所述的边缘光照效果,该数值由ndotv进行一个指数运算而得(pow函数),pow函数控制了ndotv数值的放大与缩放,即上文所述的渐变;_fresnelcolor表示fresnel这个边缘光照赋予颜色;col+表示上文的初始云雾的从顶端到凹陷的渐变色与赋予了颜色的边缘光照相加,得到带边缘光照的从顶端到凹陷的渐变色。
[0134]
步骤b,对预设深度纹理图像进行采样,得到采样深度值,将采样深度值转换至视角空间下的深度信息。
[0135]
步骤c,针对每个顶点,将该顶点处的视角空间下的深度信息与该顶点对应的深度信息进行比较,得到差值结果;其中,差值结果用于指示深度纹理图像中的指定深度信息对应的虚拟对象与着色后的初始云雾的相交程度。
[0136]
步骤d,基于差值结果确定虚拟对象与着色后的初始云雾相交处的透明度,得到调整后的初始云雾。
[0137]
在实际实现时,可以使用samplescenedepth对预设的深度纹理图像采样深度纹理,该深度纹理通常为一张渲染纹理,里面存储的是高精度的采样深度值;然后,用lineareyedepth将采样深度值转换得到视角空间下缓冲中的深度信息,该视角空间通常是以摄像机为原点朝向摄像机拍摄方向的空间;对于每个顶点来说,可以将每个顶点处的视角空间下的深度信息与当前顶点对应的深度信息screenpos.w相比较,两者之间的差值越小,代表有写入深度纹理图像的虚拟对象与云雾面片产生了相交,并且,差值越小,虚拟对象与云雾面片的重合越大,反之,差值越大,虚拟对象与云雾面片的重合越小,可以将这个差值作为云雾面片,即上述着色后的初始云雾的透明度,来实现虚拟对象和初始云雾相交处透明的效果,如图12所示的一种云雾效果示意图;可以自定义函数depthbiasfactor来控制透明的范围。
[0138]
float depth=lineareyedepth(samplescenedepth(in.screenpos.
×
y/in.screenpos.w),_zbufferparams);
[0139]
float wudepth=in.screenpos.w;
[0140]
float borderline=saturate((depth-wudepth)/_depthbiasfactor);
[0141]
其中,depth表示顶点处的视角空间下的深度信息;lineareyedepth()用于把深度纹理的采样结果转换到视角空间下的深度信息;samplescenedepth用于对深度纹理图像采样深度纹理;in.screenpos.xy表示屏幕空间的位置坐标,/in.screenpos.w的操作是将in.screenpos.xy的数值除以顶点对应的信息;zbufferparams表示预设的深度纹理图像;wudepth的数值与in.screenpos.w数值相同都是表示顶点对应的深度信息;borderline表示上文的将每个顶点处的视角空间下的深度信息与当前顶点对应的深度信息screenpos.w相比较,两者之间的差值越小,代表有写入深度纹理图像的虚拟对象与云雾面片产生了相交,并且,差值越小,虚拟对象与云雾面片的重合越大,反之,差值越大,虚拟对象与云雾面片的重合越小,可以将这个差值作为云雾面片,即上述着色后的初始云雾的透明度,来实现虚拟对象和初始云雾相交处透明的效果;_depthbiasfactor表示控制透明的范围。
[0142]
步骤e,采用预设遮罩对调整后的初始云雾的透明度进行调整,以得到该时间点对应的目标云雾。
[0143]
上述预设遮罩的数量可以有多个;比如,以预设遮罩的数量有两个为例,可以使用两个遮罩对调整后的初始云雾的alpha透明度值作进一步调整,以控制云雾的边缘形状以及云雾内的消散和凝聚,得到每个时间点对应的目标云雾。
[0144][0145]
其中,col.a表示col这个最终输出颜色的第四个浮点数,用来表示体积云雾的透明度;ndotv表示上文的计算数值,表示法线与视角方向做一个点积运算(点积即dot),再做一个归一化saturate的处理,得到一个初始菲涅尔效应的计算结果,这初始菲涅尔结果利用_opacityscale控制强度,以影响体积云雾的透明度;maskalpha与maskborderalpha表示上文的两个预设遮罩,这两个数值分别由_mask与_maskborder这两张2d纹理贴图采样in.uv这个初始纹理坐标而得,采样纹理贴图的函数就是sample_texture2d;r表示采样纹理贴图的数值的第一个浮点数值;sampler_mask与sampler_maskborder表示获取_mask与_maskborder这两张2d纹理贴图的贴图设置参数,每一张贴图自动导入unity中都有自己的贴图设置参数;_maskcontrol和maskbordercontrol分别表示两个预设遮罩的强度。
[0146]
步骤s916,将每个时间点对应的目标云雾导入至预设游戏场景中,以在游戏场景中显示目标云雾。
[0147]
参见图13所示的一种真实温泉表面的云雾示意图,为了在游戏场景中实现云雾效果,可以将上述每个时间点对应的目标云雾导入至预设游戏场景中。
[0148]
上述云雾生成方法,对于每个时间点,将该时间点对应的每个顶点的第一顶点偏移量进行调整,得到每个顶点对应的目标顶点偏移量;基于每个顶点对应的目标顶点偏移量,确定该时间点对应的目标云雾。将每个时间点对应的目标云雾导入至预设游戏场景中,以在游戏场景中显示目标云雾。该方式可以对云雾设置渐变色和光照着色,还解决了虚拟对象与云雾相交处的透明度,实现更加贴合实际的显示效果。
[0149]
另外,该方式解决了相关技术中,性能开销、效果质量和视角变化难以平衡的问题,能够利用简单平面模型和2d噪声贴图,满足表面体积云效果要求、可以更大范围移动视角、灵活形变的云雾需求。此外,该方式还大大降低了平云的制作时间、制作难度和性能消耗,通过简单平面模型和2d噪声贴图,获得动态和形状灵活的平面云只需花费0.1人天或者更少,提效200%以上,提升了在游戏场景中生成云雾的效率,其中,人天是一种计算工作量的单位,1人天等于工作时长8小时。
[0150]
本公开实施例提供了一种云雾生成装置,如图14所示,装置包括:
[0151]
第一获取模块140,用于获取预设的平面模型和2d噪声贴图;其中,平面模型中预设有多个顶点;2d噪声贴图为每个像素点的灰度值在0-1范围的灰度图像;
[0152]
第二获取模块141,用于获取平面模型的每个顶点在对应纹理坐标系中的纹理坐标;
[0153]
第一确定模块142,用于根据每个顶点的纹理坐标,对2d噪声贴图进行采样,得到
每个顶点对应的第一灰度值,将每个顶点对应的第一灰度值确定为每个顶点对应的初始顶点偏移量;
[0154]
第四获取模块143,用于获取平面模型对应的每个顶点随时间变化的偏移因子;其中,偏移因子为基于预设的云雾运动速度参数的变量;
[0155]
第二确定模块144,用于基于初始顶点偏移量和偏移因子,确定每个顶点随时间变化的第一顶点偏移量;
[0156]
第三确定模块145,用于基于第一顶点偏移量渲染生成平面模型对应的目标云雾。
[0157]
上述云雾生成装置,首先获取预设的平面模型、2d噪声贴图,以及平面模型的每个顶点在对应纹理坐标系中的纹理坐标;根据每个顶点的纹理坐标,对2d噪声贴图进行采样,得到每个顶点对应的第一灰度值,将每个顶点对应的第一灰度值确定为每个顶点对应的初始顶点偏移量;获取平面模型对应的每个顶点随时间变化的偏移因子;基于初始顶点偏移量和偏移因子,确定每个顶点随时间变化的第一顶点偏移量;基于第一顶点偏移量渲染生成平面模型对应的目标云雾。该装置通过对2d噪声贴图采样,就可以确定平面模型中每个顶点对应的初始顶点偏移量,再结合随时间变化的偏移因子确定第一顶点偏移量,由于每个顶点的第一顶点偏移量随时间变化,从而基于第一顶点偏移量可以得到更加动态、灵活的目标云雾,以匹配灵活的云雾生成需求。
[0158]
在一可选的实施方式中,第二确定模块144还用于:针对每个时间点的每个顶点,计算该顶点对应的初始顶点偏移量与该时间点对应的所述偏移因子的和,得到偏移量加和结果;对所述偏移量加和结果求平均,得到平均值,将所述平均值作为该顶点在该时间点对应的第一平均偏移量;通过预设第一函数将所述第一平均偏移量控制在预设第一范围内,得到该顶点在该时间点对应的第二平均偏移量;基于该顶点在每个时间点对应的每个第二平均偏移量,确定该顶点随时间变化的第一顶点偏移量。
[0159]
在一可选的实施方式中,第二确定模块144还用于:通过预设第二函数和预设幂指数,调整每个所述第二平均偏移量,得到该顶点在每个时间点对应的调整后的第三平均偏移量;将所述第三平均偏移量从所述第一范围映射至第二范围,并对映射结果取绝对值,得到该顶点在每个时间点对应的第四平均偏移量;通过预设第三函数将所述第四平均偏移量控制在所述第一范围内,得到该顶点随时间变化的第一顶点偏移量。
[0160]
在一可选的实施方式中,该装置还用于:响应于针对所述2d噪声贴图的缩放指令,按预设缩放系数,缩放所述2d噪声贴图;根据每个顶点的所述纹理坐标,对缩放后的2d噪声贴图进行采样,得到每个顶点对应的第二灰度值;将每个顶点对应的所述第二灰度值与所述缩放系数相乘,得到每个顶点的第二顶点偏移量;其中,每个顶点的所述第二顶点偏移量对应缩放云雾的偏移量;其中,缩放云雾基于第二顶点偏移量渲染生成;对于每个时间点,均基于该时间点对应的每个顶点的所述第一顶点偏移量、每个所述第二顶点偏移量和所述缩放系数,计算该时间点对应的每个顶点的目标融合偏移量;基于该时间点对应的每个顶点的目标融合偏移量确定该时间点对应的融合云雾;其中,所述融合云雾为所述缩放云雾和该时间点对应的所述目标云雾的融合。
[0161]
在一可选的实施方式中,该装置还用于:对于每个时间点的每个顶点,计算该顶点对应的第二顶点偏移量与第一顶点偏移量之和,得到第一加和结果;计算所述缩放系数与预设固定值之和,得到第二加和结果;将所述第一加和结果除以所述第二加和结果,得到第
signal processor,简称dsp)、专用集成电路(application specific integrated circuit,简称asic)、现场可编程门阵列(field-programmable gate array,简称fpga)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。可以实现或者执行本公开实施例中的公开的各方法、步骤及逻辑框图。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。结合本公开实施例所公开的方法的步骤可以直接体现为硬件译码处理器执行完成,或者用译码处理器中的硬件及软件模块组合执行完成。软件模块可以位于随机存储器,闪存、只读存储器,可编程只读存储器或者电可擦写可编程存储器、寄存器等本领域成熟的存储介质中。该存储介质位于存储器161,处理器160读取存储器161中的信息,结合其硬件完成前述实施例的方法的步骤,具体执行以下步骤:
[0170]
获取预设的平面模型和2d噪声贴图;其中,平面模型中预设有多个顶点;2d噪声贴图为每个像素点的灰度值在0-1范围的灰度图像;获取平面模型的每个顶点在对应纹理坐标系中的纹理坐标;根据每个顶点的纹理坐标,对2d噪声贴图进行采样,得到每个顶点对应的第一灰度值,将每个顶点对应的第一灰度值确定为每个顶点对应的初始顶点偏移量;获取平面模型对应的每个顶点随时间变化的偏移因子;其中,偏移因子为基于预设的云雾运动速度参数的变量;基于初始顶点偏移量和偏移因子,确定每个顶点随时间变化的第一顶点偏移量;基于第一顶点偏移量渲染生成平面模型对应的目标云雾。
[0171]
其具体实施例和具体工作过程,均可以参考上述方法实施例中的对应过程,在此不再赘述。
[0172]
在一可选的实施方式中,处理器在执行基于初始顶点偏移量和偏移因子,确定每个顶点随时间变化的第一顶点偏移量时,具体用于:针对每个时间点的每个顶点,计算该顶点对应的初始顶点偏移量与该时间点对应的偏移因子的和,得到偏移量加和结果;对偏移量加和结果求平均,得到平均值,将平均值作为该顶点在该时间点对应的第一平均偏移量;通过预设第一函数将第一平均偏移量控制在预设第一范围内,得到该顶点在该时间点对应的第二平均偏移量;基于该顶点在每个时间点对应的每个第二平均偏移量,确定该顶点随时间变化的第一顶点偏移量。
[0173]
在一可选的实施方式中,处理器在执行基于该顶点在每个时间点对应的每个第二平均偏移量,确定该顶点随时间变化的第一顶点偏移量时,具体用于:通过预设第二函数和预设幂指数,调整每个第二平均偏移量,得到该顶点在每个时间点对应的调整后的第三平均偏移量;将第三平均偏移量从第一范围映射至第二范围,并对映射结果取绝对值,得到该顶点在每个时间点对应的第四平均偏移量;通过预设第三函数将第四平均偏移量控制在第一范围内,得到该顶点随时间变化的第一顶点偏移量。
[0174]
在一可选的实施方式中,处理器还执行响应于针对2d噪声贴图的缩放指令,按预设缩放系数,缩放2d噪声贴图;根据每个顶点的纹理坐标,对缩放后的2d噪声贴图进行采样,得到每个顶点对应的第二灰度值;将每个顶点对应的第二灰度值与缩放系数相乘,得到每个顶点的第二顶点偏移量;其中,每个顶点的第二顶点偏移量对应缩放云雾的偏移量;其中,缩放云雾基于第二顶点偏移量渲染生成;对于每个时间点,均基于该时间点对应的每个顶点的第一顶点偏移量、每个第二顶点偏移量和缩放系数,计算该时间点对应的每个顶点的目标融合偏移量;基于该时间点对应的每个顶点的目标融合偏移量确定该时间点对应的融合云雾;其中,融合云雾为缩放云雾和该时间点对应的目标云雾的融合。
[0175]
在一可选的实施方式中,处理器在执行对于每个时间点,均基于该时间点对应的每个顶点的第一顶点偏移量、每个第二顶点偏移量和缩放系数,计算该时间点对应的每个顶点的目标融合偏移量时,具体用于:对于每个时间点的每个顶点,计算该顶点对应的第二顶点偏移量与第一顶点偏移量之和,得到第一加和结果;计算缩放系数与预设固定值之和,得到第二加和结果;将第一加和结果除以第二加和结果,得到第一计算结果;通过预设第一函数将第一计算结果控制在预设第一范围内,以得到该顶点对应的目标融合偏移量。
[0176]
在一可选的实施方式中,处理器在执行基于第一顶点偏移量渲染生成平面模型对应的目标云雾时,具体用于:对于每个时间点,将该时间点对应的每个顶点的第一顶点偏移量进行调整,得到每个顶点对应的目标顶点偏移量;其中,距离平面模型中心越远的顶点,其对应的向上的目标顶点偏移量越大;基于每个顶点对应的目标顶点偏移量,确定该时间点对应的目标云雾。
[0177]
在一可选的实施方式中,处理器在执行基于每个顶点对应的目标顶点偏移量,确定该时间点对应的目标云雾时,具体用于:对于每个时间点,基于该时间点对应的每个顶点的目标顶点偏移量,确定该时间点对应的初始云雾;通过预设第一函数将该时间点对应的每个顶点的目标顶点偏移量控制在预设第一范围内,得到每个顶点的第三顶点偏移量;基于每个顶点的第三顶点偏移量确定透明度系数;其中,第三顶点偏移量越大,透明度系数越高;基于每个顶点的透明度系数,调整初始云雾的透明度,得到具有渐变色的初始云雾;对具有渐变色的初始云雾进行光照着色,得到该时间点对应的目标云雾。
[0178]
在一可选的实施方式中,处理器在执行对具有渐变色的初始云雾进行光照着色,得到该时间点对应的目标云雾时,具体用于:对具有渐变色的初始云雾进行光照着色,得到着色后的初始云雾;对预设深度纹理图像进行采样,得到采样深度值,将采样深度值转换至视角空间下的深度信息;针对每个顶点,将该顶点处的视角空间下的深度信息与该顶点对应的深度信息进行比较,得到差值结果;其中,差值结果用于指示深度纹理图像中的指定深度信息对应的虚拟对象与着色后的初始云雾的相交程度;基于差值结果确定虚拟对象与着色后的初始云雾相交处的透明度,得到调整后的初始云雾;采用预设遮罩对调整后的初始云雾的透明度进行调整,以得到该时间点对应的目标云雾。
[0179]
通过上述方式,首先获取预设的平面模型、2d噪声贴图,以及平面模型的每个顶点在对应纹理坐标系中的纹理坐标;根据每个顶点的纹理坐标,对2d噪声贴图进行采样,得到每个顶点对应的第一灰度值,将每个顶点对应的第一灰度值确定为每个顶点对应的初始顶点偏移量;获取平面模型对应的每个顶点随时间变化的偏移因子;基于初始顶点偏移量和偏移因子,确定每个顶点随时间变化的第一顶点偏移量;基于第一顶点偏移量渲染生成平面模型对应的目标云雾。该方式通过对2d噪声贴图采样,就可以确定平面模型中每个顶点对应的初始顶点偏移量,再结合随时间变化的偏移因子确定第一顶点偏移量,由于每个顶点的第一顶点偏移量随时间变化,从而基于第一顶点偏移量可以得到更加动态、灵活的目标云雾,以匹配灵活的云雾生成需求。
[0180]
本公开实施例还提供了一种机器可读存储介质,该机器可读存储介质存储有机器可执行指令,该机器可执行指令在被处理器调用和执行时,该机器可执行指令促使处理器执行以下步骤:
[0181]
获取预设的平面模型和2d噪声贴图;其中,平面模型中预设有多个顶点;2d噪声贴
图为每个像素点的灰度值在0-1范围的灰度图像;获取平面模型的每个顶点在对应纹理坐标系中的纹理坐标;根据每个顶点的纹理坐标,对2d噪声贴图进行采样,得到每个顶点对应的第一灰度值,将每个顶点对应的第一灰度值确定为每个顶点对应的初始顶点偏移量;获取平面模型对应的每个顶点随时间变化的偏移因子;其中,偏移因子为基于预设的云雾运动速度参数的变量;基于初始顶点偏移量和偏移因子,确定每个顶点随时间变化的第一顶点偏移量;基于第一顶点偏移量渲染生成平面模型对应的目标云雾。
[0182]
其具体实施例和具体工作过程,均可以参考上述方法实施例中的对应过程,在此不再赘述。
[0183]
在一可选的实施方式中,处理器在执行基于初始顶点偏移量和偏移因子,确定每个顶点随时间变化的第一顶点偏移量时,具体用于:针对每个时间点的每个顶点,计算该顶点对应的初始顶点偏移量与该时间点对应的偏移因子的和,得到偏移量加和结果;对偏移量加和结果求平均,得到平均值,将平均值作为该顶点在该时间点对应的第一平均偏移量;通过预设第一函数将第一平均偏移量控制在预设第一范围内,得到该顶点在该时间点对应的第二平均偏移量;基于该顶点在每个时间点对应的每个第二平均偏移量,确定该顶点随时间变化的第一顶点偏移量。
[0184]
在一可选的实施方式中,处理器在执行基于该顶点在每个时间点对应的每个第二平均偏移量,确定该顶点随时间变化的第一顶点偏移量时,具体用于:通过预设第二函数和预设幂指数,调整每个第二平均偏移量,得到该顶点在每个时间点对应的调整后的第三平均偏移量;将第三平均偏移量从第一范围映射至第二范围,并对映射结果取绝对值,得到该顶点在每个时间点对应的第四平均偏移量;通过预设第三函数将第四平均偏移量控制在第一范围内,得到该顶点随时间变化的第一顶点偏移量。
[0185]
在一可选的实施方式中,处理器还执行响应于针对2d噪声贴图的缩放指令,按预设缩放系数,缩放2d噪声贴图;根据每个顶点的纹理坐标,对缩放后的2d噪声贴图进行采样,得到每个顶点对应的第二灰度值;将每个顶点对应的第二灰度值与缩放系数相乘,得到每个顶点的第二顶点偏移量;其中,每个顶点的第二顶点偏移量对应缩放云雾的偏移量;其中,缩放云雾基于第二顶点偏移量渲染生成;对于每个时间点,均基于该时间点对应的每个顶点的第一顶点偏移量、每个第二顶点偏移量和缩放系数,计算该时间点对应的每个顶点的目标融合偏移量;基于该时间点对应的每个顶点的目标融合偏移量确定该时间点对应的融合云雾;其中,融合云雾为缩放云雾和该时间点对应的目标云雾的融合。
[0186]
在一可选的实施方式中,处理器在执行对于每个时间点,均基于该时间点对应的每个顶点的第一顶点偏移量、每个第二顶点偏移量和缩放系数,计算该时间点对应的每个顶点的目标融合偏移量时,具体用于:对于每个时间点的每个顶点,计算该顶点对应的第二顶点偏移量与第一顶点偏移量之和,得到第一加和结果;计算缩放系数与预设固定值之和,得到第二加和结果;将第一加和结果除以第二加和结果,得到第一计算结果;通过预设第一函数将第一计算结果控制在预设第一范围内,以得到该顶点对应的目标融合偏移量。
[0187]
在一可选的实施方式中,处理器在执行基于第一顶点偏移量渲染生成平面模型对应的目标云雾时,具体用于:对于每个时间点,将该时间点对应的每个顶点的第一顶点偏移量进行调整,得到每个顶点对应的目标顶点偏移量;其中,距离平面模型中心越远的顶点,其对应的向上的目标顶点偏移量越大;基于每个顶点对应的目标顶点偏移量,确定该时间
点对应的目标云雾。
[0188]
在一可选的实施方式中,处理器在执行基于每个顶点对应的目标顶点偏移量,确定该时间点对应的目标云雾时,具体用于:对于每个时间点,基于该时间点对应的每个顶点的目标顶点偏移量,确定该时间点对应的初始云雾;通过预设第一函数将该时间点对应的每个顶点的目标顶点偏移量控制在预设第一范围内,得到每个顶点的第三顶点偏移量;基于每个顶点的第三顶点偏移量确定透明度系数;其中,第三顶点偏移量越大,透明度系数越高;基于每个顶点的透明度系数,调整初始云雾的透明度,得到具有渐变色的初始云雾;对具有渐变色的初始云雾进行光照着色,得到该时间点对应的目标云雾。
[0189]
在一可选的实施方式中,处理器在执行对具有渐变色的初始云雾进行光照着色,得到该时间点对应的目标云雾时,具体用于:对具有渐变色的初始云雾进行光照着色,得到着色后的初始云雾;对预设深度纹理图像进行采样,得到采样深度值,将采样深度值转换至视角空间下的深度信息;针对每个顶点,将该顶点处的视角空间下的深度信息与该顶点对应的深度信息进行比较,得到差值结果;其中,差值结果用于指示深度纹理图像中的指定深度信息对应的虚拟对象与着色后的初始云雾的相交程度;基于差值结果确定虚拟对象与着色后的初始云雾相交处的透明度,得到调整后的初始云雾;采用预设遮罩对调整后的初始云雾的透明度进行调整,以得到该时间点对应的目标云雾。
[0190]
通过上述方式,首先获取预设的平面模型、2d噪声贴图,以及平面模型的每个顶点在对应纹理坐标系中的纹理坐标;根据每个顶点的纹理坐标,对2d噪声贴图进行采样,得到每个顶点对应的第一灰度值,将每个顶点对应的第一灰度值确定为每个顶点对应的初始顶点偏移量;获取平面模型对应的每个顶点随时间变化的偏移因子;基于初始顶点偏移量和偏移因子,确定每个顶点随时间变化的第一顶点偏移量;基于第一顶点偏移量渲染生成平面模型对应的目标云雾。该方式通过对2d噪声贴图采样,就可以确定平面模型中每个顶点对应的初始顶点偏移量,再结合随时间变化的偏移因子确定第一顶点偏移量,由于每个顶点的第一顶点偏移量随时间变化,从而基于第一顶点偏移量可以得到更加动态、灵活的目标云雾,以匹配灵活的云雾生成需求。
[0191]
本公开实施例所提供的云雾生成方法、装置及电子设备的计算机程序产品,包括存储了程序代码的计算机可读存储介质,所述程序代码包括的指令可用于执行前面方法实施例中所述的方法,具体实现可参见方法实施例,在此不再赘述。
[0192]
所述功能如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本公开的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本公开各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、移动硬盘、只读存储器(rom,read-only memory)、随机存取存储器(ram,random access memory)、磁碟或者光盘等各种可以存储程序代码的介质。
[0193]
最后应说明的是:以上各实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述各实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术
方案的范围。