动态体积云的渲染方法、装置及电子设备与流程
本申请涉及游戏渲染技术领域,尤其是涉及一种动态体积云的渲染方法、装置及电子设备。
背景技术:
目前游戏的渲染是以光栅化为主,但是,利用光栅化的渲染结构设计,来表现流体的效果还是比较难的,一般都会用简单的面片来模拟,但这种面片模拟就很难表现出流体的流动特性,也不支持换视角查看。而在一些比较成熟的大型商业项目中,有些游戏则会使用raymarching(光线步进)体素渲染的方法来实现,但是在部分游戏引擎中不支持体素渲染的关键资源3dtexture的使用,进而无法对3dtexture进行后续渲染过程。
技术实现要素:
本申请的目的在于提供一种动态体积云的渲染方法、装置及电子设备能够基于2d贴图实现类似3dtexture材质的效果,得到3d纹理贴图,进而可以在不支持3dtexture的游戏引擎中实现3d纹理贴图的渲染过程。
第一方面,本申请实施例提供一种动态体积云的渲染方法,方法用于在计算机虚拟场景的天空中渲染生成体积云,方法包括:读取预先存储的多张2d噪声贴图,其中,多张2d噪声贴图是通过对第一3d噪声贴图进行z轴方向的多次偏移采样获得的,且每张2d噪声贴图记录有其偏移值;基于多张2d噪声贴图及其偏移值,构建第二3d噪声贴图;将第二3d噪声贴图映射在限定的天空区域中渲染生成体积云。
进一步的,上述第一3d噪声贴图通过下述步骤预先生成:获取第一柏林噪声贴图和第一细胞噪声贴图;对第一柏林噪声贴图和第一细胞噪声贴图进行混合,生成第一3d噪声贴图。
进一步的,上述对第一柏林噪声贴图和第一细胞噪声贴图进行混合,生成第一3d噪声贴图的步骤,包括:将第一柏林噪声贴图和第一细胞噪声贴图进行图像相乘,得到第一3d噪声贴图。
进一步的,上述第一柏林噪声贴图通过以下步骤预先生成:获取多张第二柏林噪声贴图;将多张第二柏林噪声贴图进行混合,生成第一柏林噪声贴图。
进一步的,上述将多张第二柏林噪声贴图进行混合,生成第一柏林噪声贴图的步骤,包括:通过分形布朗运动模型对多张第二柏林噪声贴图进行多层混合,生成第一柏林噪声贴图。
进一步的,上述读取预先存储的多张2d噪声贴图的步骤之前,方法还包括:沿第一3d噪声贴图的z轴方向,按照预设的像素偏移单位进行2d贴图采样;存储采样得到的多张2d噪声贴图和2d噪声贴图对应的偏移值。
进一步的,上述基于多张2d噪声贴图及其偏移值,构建第二3d噪声贴图的步骤,包括:按照多张2d噪声贴图分别对应的偏移值,将多个2d噪声贴图在z轴方向上顺序叠加,得到第二3d噪声贴图。
进一步的,上述将第二3d噪声贴图映射在限定的天空区域中渲染生成体积云的步骤,包括:将第二3d噪声贴图映射在限定的天空区域中;自限定的天空区域起始高度或结束高度起,以预设单位步长为间隔分别计算天空区域不同高度的第二3d噪声贴图的光照数据;基于第二3d噪声贴图和光照数据在天空区域渲染生成体积云。
进一步的,上述光照数据的计算方式包括:主题透光计算和/或光照强度计算。
进一步的,上述在将第二3d噪声贴图映射在限定的天空区域中渲染生成体积云的步骤之前,还包括:对第二3d噪声贴图进行边缘剃除调整和/或密度调整。
第二方面,本申请实施例还提供一种动态体积云的渲染装置,装置用于在计算机虚拟场景的天空中渲染生成体积云,装置包括:2d贴图读取模块,用于读取预先存储的多张2d噪声贴图,其中,多张2d噪声贴图是通过对第一3d噪声贴图进行z轴方向的多次偏移采样获得的,且每张2d噪声贴图记录有其偏移值;3d贴图构建模块,用于基于多张2d噪声贴图及其偏移值,构建第二3d噪声贴图;体积云渲染模块,用于将第二3d噪声贴图映射在限定的天空区域中渲染生成体积云。
第三方面,本申请实施例还提供一种电子设备,包括处理器和存储器,存储器存储有能够被处理器执行的计算机可执行指令,处理器执行计算机可执行指令以实现上述方法。
第四方面,本申请实施例还提供一种计算机可读存储介质,计算机可读存储介质存储有计算机可执行指令,计算机可执行指令在被处理器调用和执行时,计算机可执行指令促使处理器实现上述方法。
本申请实施例提供的动态体积云的渲染方法、装置及电子设备中,首先读取预先存储的多张2d噪声贴图,其中,多张2d噪声贴图是通过对第一3d噪声贴图进行z轴方向的多次偏移采样获得的,且每张2d噪声贴图记录有其偏移值;然后基于多张2d噪声贴图及其偏移值,可以构建第二3d噪声贴图;最后可以将第二3d噪声贴图映射在限定的天空区域中渲染生成体积云。本申请实施例能够在引擎中利用预先存储的通过对3d贴图偏移采样得到的多个2d噪声贴图,构建3d噪声贴图,进而可以基于该3d噪声贴图实现动态体积云的渲染过程,最终在计算机虚拟场景的天空中渲染生成体积云。
附图说明
为了更清楚地说明本申请具体实施方式或现有技术中的技术方案,下面将对具体实施方式或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图是本申请的一些实施方式,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本申请实施例提供的一种动态体积云的渲染方法的流程图;
图2为本申请实施例提供的一种第一3d噪声贴图的生成方法的流程图;
图3为本申请实施例提供的一种第二柏林噪声贴图的效果图;
图4为本申请实施例提供的一种第一柏林噪声贴图的效果图;
图5为本申请实施例提供的一种第一细胞噪声贴图的效果图;
图6为本申请实施例提供的一种第一3d噪声贴图的效果图;
图7为本申请实施例提供的一种体积云渲染方法的流程图;
图8为本申请实施例提供的一种体积云渲染光照示意图;
图9为本申请实施例提供的一种第二3d噪声贴图的边缘剔除调整的效果图;
图10为本申请实施例提供的一种第二3d噪声贴图的密度调整的效果图;
图11为本申请实施例提供的一种动态体积云的渲染装置的结构框图;
图12为本申请实施例提供的一种电子设备的结构示意图。
具体实施方式
下面将结合实施例对本申请的技术方案进行清楚、完整地描述,显然,所描述的实施例是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
目前游戏的渲染是以光栅化为主,但是,利用光栅化的渲染结构设计,来表现流体的效果还是比较难的,一般都会用简单的面片来模拟,但这种面片模拟就很难表现出云的流动特性,也不支持换视角查看。而在一些比较成熟的大型商业项目中,有些游戏则会基于3dtexture使用raymarching(光线步进)体素渲染的方法来实现。
3dtexture,即3d纹理,是一种立体的“图形”,如同2d纹理是一个(x,y)形式的像素矩阵,3d纹理是一个(x,y,z)形式的三维像素矩阵,每一个(x,y,z)对应一个标量值;3d纹理贴图就是要把这个三维的像素阵列映射到三维的物体空间中去;通常将物体和3d纹理处理成立方体或圆柱体,可以更好地实现渲染过程。
但是在部分游戏引擎中不支持体素渲染的关键资源3dtexture的使用,遇到的问题也比较多。
基于此,本申请实施例提供一种动态体积云的渲染方法、装置及电子设备,能够基于2d贴图实现类似3dtexture材质的效果,得到3d纹理贴图,进而可以在不支持3dtexture的游戏引擎中实现3d纹理贴图的渲染过程。
图1为本申请实施例提供的一种动态体积云的渲染方法的流程图,该方法可用于在计算机虚拟场景的天空中渲染生成体积云,该方法的执行主体可以为游戏引擎,该方法具体包括下步骤:
步骤s102,读取预先存储的多张2d噪声贴图,其中,多张2d噪声贴图是通过对第一3d噪声贴图进行z轴方向的多次偏移采样获得的,且每张2d噪声贴图记录有其偏移值。
具体实施时,上述游戏引擎中预先存储有多张2d噪声贴图(关于云的),多张2d噪声贴图是通过对第一3d噪声贴图进行z轴方向的多次偏移采样获得的,且每张2d噪声贴图记录有其偏移值。比如,第一张2d噪声贴图,对应的偏移值为1,第二张2d噪声贴图,对应的偏移值为2,以此类推,本申请实施例中,偏移采样64次,对应有64张2d噪声贴图。
上述第一3d噪声贴图可以是直接使用现有的3d噪声贴图,也可根据所需要实现的动态云效果预先制作,例如:可以通过柏林噪声贴图和细胞噪声贴图进行预设处理得到的,在此不做具体限定。
步骤s104,基于多张2d噪声贴图及其偏移值,构建第二3d噪声贴图。
由于每张2d噪声贴图都对应有一个偏移值,因此,可以按照多张2d噪声贴图分别对应的偏移值,将多个2d噪声贴图在z轴方向上顺序叠加,得到第二3d噪声贴图。
步骤s106,将第二3d噪声贴图映射在限定的天空区域中渲染生成体积云。
在构建也第二3d噪声贴图后,进一步将其映射在限定的天空区域中,进行体积云的渲染过程,比如,通过光线步进方式及预设的光照算法计算光照,进而根据光照数据和第二3d噪声贴图在限定的天空区域中渲染生成体积云。
本申请实施例提供的动态体积云的渲染方法中,能够在游戏引擎中利用预先存储的通过对3d贴图偏移采样得到的多个2d噪声贴图,构建3d噪声贴图,进而可以基于该3d噪声贴图实现动态体积云的渲染过程,最终在计算机虚拟场景的天空中渲染生成体积云。
为了实现更好的体积云的动态渲染效果,本申请实施例还提供一种第一3d噪声贴图的生成方法,具体可参见图2所示的流程图实现:
步骤s202,获取第一柏林噪声贴图和第一细胞噪声贴图。
上述柏林噪声指由kenperlin发明的自然噪声生成算法,柏林噪声贴图为通过自然噪声生成算法生成的云的2d贴图。上述细胞噪声(cellnoise,也称作worleynoise)贴图是基于voronoi图的噪声生成算法生成的贴图,该贴图是一种3d贴图。因此,需要首先将柏林噪声贴图处理成3d的第一柏林噪声贴图。上述第一柏林噪声贴图的生成过程可以包括以下步骤:
(1)获取多张第二柏林噪声贴图;如图3所示,第二柏林噪声贴图为2d贴图,比如,可以将一张第二柏林噪声贴图复制多份,得到多张第二柏林噪声贴图。
(2)将多张第二柏林噪声贴图进行混合,生成第一柏林噪声贴图,如图4所示。
为了实现多层混合后的贴图有更好的细节效果,本申请实施例中可以通过分形布朗运动模型对多张第二柏林噪声贴图进行多层混合,生成第一柏林噪声贴图。或者说,可以对多张第二柏林噪声贴图进行相加和/或相乘运算,得到第一柏林噪声贴图,该第一柏林噪声贴图为一个3d贴图。
分形布朗运动fbm(fractalbrownmotion)是一种数学模型,它主要用于描述自然界的山脉、云层、地形地貌以及模拟星球表面等不规则形状。本实施例中,通过以一定的倍数连续升高频率,并以一定的比例的振幅,在循环中不断叠加柏林噪声贴图,最终得到的多层混合后的贴图会有更好的体积云的细节。
步骤s204,对第一柏林噪声贴图和第一细胞噪声贴图进行混合,生成第一3d噪声贴图。
上述生成的第一柏林噪声贴图为一个3d贴图,如图4所示,上述第一细胞噪声贴图也是一个3d贴图,如图5所示,然后将该第一柏林噪声贴图和上述第一细胞噪声贴图进行一个图像相乘运算,即可得到第一3d噪声贴图,如图6所示。
为了方便运算,在制作上述两个3d贴图时,建议将两个3d贴图制作为相同大小的贴图,如果两者大小不一致,可通过缩放、剪切等处理方法对贴图进行调整。
基于上述生成的第一3d噪声贴图,通过偏移采样可以得到多个2d噪声贴图,其具体过程可通过以下方式实现:
(1)沿第一3d噪声贴图的z轴方向,按照预设的像素偏移单位进行2d贴图采样。上述预设的像素偏移单位可以是一个像素,也可以是多个像素。
(2)存储采样得到的多张2d噪声贴图和2d噪声贴图对应的偏移值。这里的偏移值也可以看作是该2d噪声贴图对应于坐标系中的z坐标值。
传统的raymarching是从一个点(一般是虚拟摄像机的位置)发出射线,判断是否与渲染物体相交来决定渲染效果。步长平均,有大量的计算都在空白像素中。本申请实施例对此过程进行了优化,即预先设定了云的渲染高度,即限定的天空区域的起始高度和结束高度。
本申请实施例中,体积云的渲染过程可以参见图7所示的一种体积云渲染方法的流程图实现:
步骤s702,将第二3d噪声贴图映射在限定的天空区域中。
步骤s704,自限定的天空区域起始高度或结束高度起,以预设单位步长为间隔分别计算天空区域不同高度的第二3d噪声贴图的光照数据。
步骤s706,基于第二3d噪声贴图和光照数据在天空区域渲染生成体积云。
在体积云渲染时,可以从限定的天空区域起始高度向结束高度的方向发射,也可以从限定的天空区域结束高度向起始高度的方向发射进行光线追踪。比如,从限定的天空区域的起始高度开始发射射线;每隔预设单位步长,对第二3d噪声贴图进行一次光照计算,直到达到结束高度,可以计算出天空区域不同高度的第二3d噪声贴图的光照数据。
如图8所示,首先设置了天空区域的初始高度和云结束高度,而射线发射的起点就是天空区域的初始高度,从起始高度发射射线,然后在第二3d噪声贴图的底平面计算一次光照,然后会以预设单位步长升高,再在第二3d噪声贴图的底平面计算一次光照,直到渲染到结束高度,得到天空区域不同高度的第二3d噪声贴图的光照数据,进而在限定的天空区域中呈现出体积云的渲染效果图。
上述光照数据的计算方式可以包括:主题透光计算和/或光照强度计算。主题透光计算,为根据beer’slaw定律光线穿越均匀的参与介质过程中,亮度呈指数衰减,比如云层较厚的地方颜色较暗。光照强度计算可以用于计算云的各向异性散射特性,通过该计算可以表现出朝着太阳看云时,云的边缘处的发光效果。
上述这种从限定的天空区域的初始高度或结束调度开始发射射线进行运算是远比从摄像机初始点发射射线效率高,而且画面也会好很多,可以满足在一高度之上的云层全部渲染出来,而从摄像机出发点的射线则很容易出现因为距离太短导致远处渲染不齐全的问题。
为了实现更好的体积云的渲染效果,在将第二3d噪声贴图映射在限定的天空区域中渲染生成体积云的步骤之前,还可以包括以下步骤:
对第二3d噪声贴图进行边缘剃除调整和/或密度调整。第二3d噪声贴图的边缘剃除调整的效果如图9所示,第二3d噪声贴图的密度调整的效果如图10所示。
本申请实施例提供的动态体积云的渲染方法,能够基于2d贴图实现类似3dtexture材质的效果,得到3d纹理贴图,进而可以在不支持3dtexture的游戏引擎中实现3d纹理贴图的渲染过程。并且可以提高体积云的渲染效率,使美术工作者能够结合一些简单的参数调整,来实现不同的渲染效果。
基于上述方法实施例,本申请实施例还提供一种动态体积云的渲染装置,该装置用于在计算机虚拟场景的天空中渲染生成体积云,参见图11所示,该动态体积云的渲染装置包括:
2d贴图读取模块112,用于读取预先存储的多张2d噪声贴图,其中,多张2d噪声贴图是通过对第一3d噪声贴图进行z轴方向的多次偏移采样获得的,且每张2d噪声贴图记录有其偏移值;
3d贴图构建模块114,用于基于多张2d噪声贴图及其偏移值,构建第二3d噪声贴图;
体积云渲染模块116,用于将第二3d噪声贴图映射在限定的天空区域中渲染生成体积云。
在另一种可能的实施方式中,上述装置还包括:贴图生成模块,用于获取第一柏林噪声贴图和第一细胞噪声贴图;对第一柏林噪声贴图和第一细胞噪声贴图进行混合,生成第一3d噪声贴图。
在另一种可能的实施方式中,上述贴图生成模块还用于,将第一柏林噪声贴图和第一细胞噪声贴图进行图像相乘,得到第一3d噪声贴图。
在另一种可能的实施方式中,上述贴图生成模块还用于,获取多张第二柏林噪声贴图;将多张第二柏林噪声贴图进行混合,生成第一柏林噪声贴图。
在另一种可能的实施方式中,上述贴图生成模块还用于,通过分形布朗运动模型对多张第二柏林噪声贴图进行多层混合,生成第一柏林噪声贴图。
在另一种可能的实施方式中,上述装置还包括偏移采样模块,用于:沿第一3d噪声贴图的z轴方向,按照预设的像素偏移单位进行2d贴图采样;贴图存储模块,用于存储采样得到的多张2d噪声贴图和2d噪声贴图对应的偏移值。
在另一种可能的实施方式中,上述3d贴图构建模块114还用于:按照多张2d噪声贴图分别对应的偏移值,将多个2d噪声贴图在z轴方向上顺序叠加,得到第二3d噪声贴图。
在另一种可能的实施方式中,上述体积云渲染模块116还用于:将第二3d噪声贴图映射在限定的天空区域中;自限定的天空区域起始高度或结束高度起,以预设单位步长为间隔分别计算天空区域不同高度的第二3d噪声贴图的光照数据;基于第二3d噪声贴图和光照数据在天空区域渲染生成体积云。
在另一种可能的实施方式中,上述光照数据的计算方式包括:主题透光计算和/或光照强度计算。
在另一种可能的实施方式中,上述装置还包括:贴图调整模块,用于对第二3d噪声贴图进行边缘剃除调整和/或密度调整。
本申请实施例提供的动态体积云的渲染装置,其实现原理及产生的技术效果和前述动态体积云的渲染方法实施例相同,为简要描述,动态体积云的渲染装置的实施例部分未提及之处,可参考前述动态体积云的渲染方法实施例中相应内容。
本申请实施例还提供了一种电子设备,如图12所示,为该电子设备的结构示意图,其中,该电子设备包括处理器121和存储器120,该存储器120存储有能够被该处理器121执行的计算机可执行指令,该处理器121执行该计算机可执行指令以实现上述动态体积云的渲染方法。
在图12示出的实施方式中,该电子设备还包括总线122和通信接口123,其中,处理器121、通信接口123和存储器120通过总线122连接。
其中,存储器120可能包含高速随机存取存储器(ram,randomaccessmemory),也可能还包括非不稳定的存储器(non-volatilememory),例如至少一个磁盘存储器。通过至少一个通信接口123(可以是有线或者无线)实现该系统网元与至少一个其他网元之间的通信连接,可以使用互联网,广域网,本地网,城域网等。总线122可以是isa(industrystandardarchitecture,工业标准体系结构)总线、pci(peripheralcomponentinterconnect,外设部件互连标准)总线或eisa(extendedindustrystandardarchitecture,扩展工业标准结构)总线等。所述总线122可以分为地址总线、数据总线、控制总线等。为便于表示,图12中仅用一个双向箭头表示,但并不表示仅有一根总线或一种类型的总线。
处理器121可能是一种集成电路芯片,具有信号的处理能力。在实现过程中,上述方法的各步骤可以通过处理器121中的硬件的集成逻辑电路或者软件形式的指令完成。上述的处理器121可以是通用处理器,包括中央处理器(centralprocessingunit,简称cpu)、网络处理器(networkprocessor,简称np)等;还可以是数字信号处理器(digitalsignalprocessor,简称dsp)、专用集成电路(applicationspecificintegratedcircuit,简称asic)、现场可编程门阵列(field-programmablegatearray,简称fpga)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。结合本申请实施例所公开的方法的步骤可以直接体现为硬件译码处理器执行完成,或者用译码处理器中的硬件及软件模块组合执行完成。软件模块可以位于随机存储器,闪存、只读存储器,可编程只读存储器或者电可擦写可编程存储器、寄存器等本领域成熟的存储介质中。该存储介质位于存储器,处理器121读取存储器中的信息,结合其硬件完成前述实施例的贴图的处理方法的步骤。
本申请实施例还提供了一种计算机可读存储介质,该计算机可读存储介质存储有计算机可执行指令,该计算机可执行指令在被处理器调用和执行时,该计算机可执行指令促使处理器实现上述动态体积云的渲染方法,具体实现可参见前述方法实施例,在此不再赘述。
本申请实施例所提供的动态体积云的渲染方法、装置和电子设备的计算机程序产品,包括存储了程序代码的计算机可读存储介质,所述程序代码包括的指令可用于执行前面方法实施例中所述的方法,具体实现可参见方法实施例,在此不再赘述。
除非另外具体说明,否则在这些实施例中阐述的部件和步骤的相对步骤、数字表达式和数值并不限制本申请的范围。
所述功能如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个处理器可执行的非易失的计算机可读取存储介质中。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、移动硬盘、只读存储器(rom,read-onlymemory)、随机存取存储器(ram,randomaccessmemory)、磁碟或者光盘等各种可以存储程序代码的介质。
在本申请的描述中,需要说明的是,术语“中心”、“上”、“下”、“左”、“右”、“竖直”、“水平”、“内”、“外”等指示的方位或位置关系为基于附图所示的方位或位置关系,仅是为了便于描述本申请和简化描述,而不是指示或暗示所指的装置或元件必须具有特定的方位、以特定的方位构造和操作,因此不能理解为对本申请的限制。此外,术语“第一”、“第二”、“第三”仅用于描述目的,而不能理解为指示或暗示相对重要性。
最后应说明的是:以上所述实施例,仅为本申请的具体实施方式,用以说明本申请的技术方案,而非对其限制,本申请的保护范围并不局限于此,尽管参照前述实施例对本申请进行了详细的说明,本领域的普通技术人员应当理解:任何熟悉本技术领域的技术人员在本申请揭露的技术范围内,其依然可以对前述实施例所记载的技术方案进行修改或可轻易想到变化,或者对其中部分技术特征进行等同替换;而这些修改、变化或者替换,并不使相应技术方案的本质脱离本申请实施例技术方案的精神和范围,都应涵盖在本申请的保护范围之内。因此,本申请的保护范围应所述以权利要求的保护范围为准。
起点商标作为专业知识产权交易平台,可以帮助大家解决很多问题,如果大家想要了解更多知产交易信息请点击 【在线咨询】或添加微信 【19522093243】与客服一对一沟通,为大家解决相关问题。
此文章来源于网络,如有侵权,请联系删除