本申请涉及图像处理技术领域,特别是涉及一种场景渲染方法、装置、计算机设备和存储介质。
背景技术:
计算机图形学中的渲染,通常表示将三维场景中的模型,按照设定好的环境、灯光、材质及渲染参数,二维投影成数字图像的过程,以仿真地展现三维空间物体的几何形状和质地的显示效果。三维场景中的一些不透明物体与透明物体可以在空间上交织在一起,以展现出透明物体材质和物体的层次关系。
在相关技术中,对于包括不透明物体和半透明物体的场景,通常是通过多步渲染的方式采用多个渲染通道进行渲染,通过一个渲染通道渲染不透明物体,然后再通过另一个渲染通道渲染透明物体,最终合成不透明物体和透明物体的渲染结果。然而,这种方式会导致渲染过程中的资源消耗较大。
技术实现要素:
基于此,有必要针对上述技术问题,提供一种能够有效降低渲染过程中的资源消耗的场景渲染方法、装置、计算机设备和存储介质。
一种场景渲染方法,所述方法包括:
当待渲染的当前帧的场景中包括特定效果区域时,所述特定效果区域为目标不透明物体对应的区域,所述目标不透明物体,是所述当前帧中的半透明特定效果物体所覆盖的不透明物体,则
获取与上一帧对应的单渲染通道中的不透明物体的历史场景渲染数据;
确定所述特定效果区域在所述历史场景渲染数据中相匹配的历史场景渲染数据;
基于当前帧对应的整体场景数据和所述相匹配的历史场景渲染数据,在与所述当前帧对应的单渲染通道中,渲染所述当前帧的场景中不透明物体、所述特定效果区域以及半透明物体。
一种场景渲染装置,所述装置包括:
数据获取模块,用于当待渲染的当前帧的场景中包括特定效果区域时,所述特定效果区域为目标不透明物体对应的区域,所述目标不透明物体,是所述当前帧中的半透明特定效果物体所覆盖的不透明物体,则获取与上一帧对应的单渲染通道中的不透明物体的历史场景渲染数据;确定所述特定效果区域在所述历史场景渲染数据中相匹配的历史场景渲染数据;
场景渲染模块,用于基于当前帧对应的整体场景数据和所述相匹配的历史场景渲染数据,在与所述当前帧对应的单渲染通道中,渲染所述当前帧的场景中不透明物体、所述特定效果区域以及半透明物体。
在一个实施例中,所述数据获取模块还用于确定所述特定效果区域在所述上一帧中所对应的采样位置;根据所述采样位置对所述历史场景渲染数据进行采样处理,得到所述特定效果区域在所述历史场景渲染数据中相匹配的历史场景渲染数据。
在一个实施例中,所述数据获取模块还用于根据所述当前帧对应的投影矩阵,确定所述特定效果区域对应的三维场景位置;根据所述三维场景位置和所述上一帧对应的投影矩阵进行位置变换,得到重映射后的所述特定效果区域在所述上一帧中所对应的采样坐标。
在一个实施例中,所述数据获取模块还用于当所述特定效果区域包括反射效果区域时,根据所述当前帧对应的投影矩阵,确定所述当前帧中的相机视角和所述反射效果区域的反射位置;根据所述当前帧中的相机视角和所述反射效果区域的反射位置,确定对称反射射线;根据所述对称反射射线,确定所述反射效果区域对应的三维场景位置。
在一个实施例中,所述数据获取模块还用于当所述特定效果区域包括折射效果区域时,根据所述当前帧中的相机视角和所述折射效果区域对应的法线方向,确定采样坐标偏移量;根据所述采样坐标偏移量,确定所述折射效果区域在所述上一帧中所对应的采样位置。
在一个实施例中,所述数据获取模块还用于获取与上一帧对应的单渲染通道绑定的渲染缓冲区中的不透明物体的历史场景渲染数据;上述场景渲染装置还包括数据缓存模块,用于将渲染所述当前帧后得到的整体场景渲染数据、以及所述整体场景渲染数据中的不透明物体的场景渲染数据,写入与所述当前帧对应的单渲染通道绑定的渲染缓冲区中。
在一个实施例中,所述渲染缓冲区包括整体场景缓冲区和不透明物体缓冲区;所述数据获取模块还用于从所述上一帧对应的单渲染通道所绑定的不透明物体缓冲区中,获取所述上一帧中不透明物体的历史场景渲染数据;所述数据缓存模块还用于将渲染所述当前帧后得到的整体场景渲染数据,缓存至与所述当前帧的单渲染通道绑定的所述整体场景缓冲区中;将所述整体场景渲染数据中的不透明物体的场景渲染数据,缓存至与所述当前帧的单渲染通道绑定的所述不透明物体缓冲区中。
在一个实施例中,所述场景渲染模块还用于基于当前帧对应的整体场景数据,在与所述当前帧对应的单渲染通道中渲染所述当前帧的场景中的不透明物体;基于所述相匹配的历史场景渲染数据,在所述单渲染通道中渲染所述当前帧的场景中的所述特定效果区域;基于所述整体场景数据,在所述单渲染通道中渲染所述当前帧的场景中的半透明物体,得到所述当前帧对应的整体场景渲染数据。
在一个实施例中,所述数据获取模块还用于当所述特定效果区域包括水面效果区域时,根据预设水面高度确定与所述水面效果区域相匹配的预设场景数据;所述场景渲染模块还用于在渲染所述水面效果区域时,基于所述相匹配的历史场景渲染数据和所述预设场景数据,在所述单渲染通道中渲染所述当前帧的场景中的所述水面效果区域。
在一个实施例中,所述相匹配的历史场景渲染数据为基于重映射后的采样坐标所采样的第一场景渲染数据;所述数据获取模块还用于若所述当前帧对应的所述单渲染通道中包括子渲染通道时,通过所述子渲染通道获取所述特定效果区域对应的所述当前帧的场景数据;所述场景渲染模块还用于在渲染所述特定效果区域时,根据所述特定效果区域对应的所述当前帧中的场景数据和所述第一场景渲染数据,确定所述特定效果区域对应的目标场景数据;基于所述目标场景数据,在所述单渲染通道中渲染所述当前帧的场景中的所述特定效果区域。
在一个实施例中,所述场景渲染模块还用于当所述特定效果区域包括折射效果区域时,确定所述渲染缓冲区中的所述第一场景渲染数据对应的待矫正像素点;根据所述当前帧的场景数据中的与所述待矫正像素点对应的场景数据,替换所述待矫正像素点在所述第一场景渲染数据中对应的场景渲染数据,得到所述特定效果区域的目标场景数据。
在一个实施例中,所述场景渲染模块还用于确定第一深度值与第二深度值之间的第一深度差值;基于采样坐标偏移量,从所述历史场景渲染数据中采样与所述特定效果区域相匹配的第二场景渲染数据;确定同一像素点在所述第一场景渲染数据和第二场景渲染数据中的第二深度差值;当所述第一深度差值大于或等于第一阈值、且第二深度差值大于或等于第二阈值时,判定所述像素点为待矫正像素点。
一种计算机设备,包括存储器和处理器,所述存储器存储有计算机程序,所述处理器执行所述计算机程序时实现以下步骤:
当待渲染的当前帧的场景中包括特定效果区域时,所述特定效果区域为目标不透明物体对应的区域,所述目标不透明物体,是所述当前帧中的半透明特定效果物体所覆盖的不透明物体,则
获取与上一帧对应的单渲染通道中的不透明物体的历史场景渲染数据;
确定所述特定效果区域在所述历史场景渲染数据中相匹配的历史场景渲染数据;
基于当前帧对应的整体场景数据和所述相匹配的历史场景渲染数据,在与所述当前帧对应的单渲染通道中,渲染所述当前帧的场景中不透明物体、所述特定效果区域以及半透明物体。
一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现以下步骤:
当待渲染的当前帧的场景中包括特定效果区域时,所述特定效果区域为目标不透明物体对应的区域,所述目标不透明物体,是所述当前帧中的半透明特定效果物体所覆盖的不透明物体,则
获取与上一帧对应的单渲染通道中的不透明物体的历史场景渲染数据;
确定所述特定效果区域在所述历史场景渲染数据中相匹配的历史场景渲染数据;
基于当前帧对应的整体场景数据和所述相匹配的历史场景渲染数据,在与所述当前帧对应的单渲染通道中,渲染所述当前帧的场景中不透明物体、所述特定效果区域以及半透明物体。
上述场景渲染方法、装置、计算机设备和存储介质,当待渲染的当前帧的场景中包括特定效果区域时,则获取与上一帧对应的单渲染通道中的不透明物体的历史场景渲染数据,其中,特定效果区域为目标不透明物体对应的区域,目标不透明物体是当前帧中的半透明特定效果物体所覆盖的不透明物体。通过确定特定效果区域在历史场景渲染数据中相匹配的历史场景渲染数据,能够精准地采样得到特定效果区域在上一帧中相匹配的历史场景渲染数据。进而基于当前帧对应的整体场景数据和相匹配的历史场景渲染数据,通过在与当前帧对应的单渲染通道中,渲染当前帧的场景中不透明物体、特定效果区域以及半透明物体。从而能够有效得到渲染精准度较高的整体场景渲染数据,进而能够高效精准地渲染出具有特定效果的图像帧,由此能够高效地实现在同一渲染通道中渲染不透明物体、特定效果区域以及半透明物体,同时有效减少了渲染过程中的带宽压力,从而有效降低了渲染过程中的资源消耗。
附图说明
图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为另一个实施例中对水面区域的不透明物体渲染后的示意图;
图27为一个实施例中对水面区域中高速运动的物体渲染后的示意图;
图28为一个实施例中场景渲染装置的结构框图;
图29为一个实施例中计算机设备的内部结构图。
具体实施方式
为了使本申请的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本申请进行进一步详细说明。应当理解,此处描述的具体实施例仅仅用以解释本申请,并不用于限定本申请。
本申请提供的场景渲染方法,可以应用于如图1所示的应用环境中。其中,终端102通过网络与服务器104进行通信。终端102从服务器104中获取待渲染的场景所需的场景数据。终端102在对场景进行渲染的过程中,当待渲染的当前帧的场景中包括特定效果区域时,则获取与上一帧对应的单渲染通道中的不透明物体的历史场景渲染数据;其中,特定效果区域为目标不透明物体对应的区域,目标不透明物体是当前帧中的半透明特定效果物体所覆盖的不透明物体;确定特定效果区域在历史场景渲染数据中相匹配的历史场景渲染数据。然后基于当前帧对应的整体场景数据和相匹配的历史场景渲染数据,在单渲染通道中渲染当前帧的场景中不透明物体、特定效果区域以及半透明物体。
其中,终端102可以但不限于是各种个人计算机、笔记本电脑、智能手机、平板电脑和便携式可穿戴设备,服务器104可以用独立的服务器或者是多个服务器组成的服务器集群来实现。服务器可以是独立的物理服务器,也可以是多个物理服务器构成的服务器集群或者分布式系统,还可以是提供云服务、云数据库、云计算、云函数、云存储、网络服务、云通信、中间件服务、域名服务、安全服务、cdn、以及大数据和人工智能平台等基础云计算服务的云服务器。终端可以是智能手机、平板电脑、笔记本电脑、台式计算机、智能音箱、智能手表等,但并不局限于此。终端以及服务器可以通过有线或无线通信方式进行直接或间接地连接,本申请在此不做限制。
云技术(cloudtechnology)是指在广域网或局域网内将硬件、软件、网络等系列资源统一起来,实现数据的计算、储存、处理和共享的一种托管技术。云技术基于云计算商业模式应用的网络技术、信息技术、整合技术、管理平台技术、应用技术等的总称,可以组成资源池,按需所用,灵活便利。云计算技术将变成重要支撑。技术网络系统的后台服务需要大量的计算、存储资源,如视频网站、图片类网站和更多的门户网站。伴随着互联网行业的高度发展和应用,将来每个物品都有可能存在自己的识别标志,都需要传输到后台系统进行逻辑处理,不同程度级别的数据将会分开处理,各类行业数据皆需要强大的系统后盾支撑,只能通过云计算来实现。
计算机视觉技术(computervision,cv)计算机视觉是一门研究如何使机器“看”的科学,更进一步的说,就是指用摄影机和电脑代替人眼对目标进行识别、跟踪和测量等机器视觉,并进一步做图形处理,使电脑处理成为更适合人眼观察或传送给仪器检测的图像。作为一个科学学科,计算机视觉研究相关的理论和技术,试图建立能够从图像或者多维数据中获取信息的人工智能系统。计算机视觉技术通常包括图像处理、图像识别、图像语义理解、图像检索、ocr、视频处理、视频语义理解、视频内容/行为识别、三维物体重建、3d技术、虚拟现实、增强现实、同步定位与地图构建等技术,还包括常见的人脸识别、指纹识别等生物特征识别技术。可以理解,在本申请的场景渲染方法,就是基于计算机视觉技术对待渲染的图像帧进行渲染处理,能够有效提高场景渲染的效率。
在一个实施例中,如图2所示,提供了一种场景渲染方法,以该方法应用于图1中的终端为例进行说明,包括以下步骤:
s202,当待渲染的当前帧的场景中包括特定效果区域时,特定效果区域为目标不透明物体对应的区域,目标不透明物体,是当前帧中的半透明特定效果物体所覆盖的不透明物体,则获取与上一帧对应的单渲染通道中的不透明物体的历史场景渲染数据。
可以理解,在计算机图形中,渲染是指将三维场景中的物体模型,按照设定好的环境、材质、光照及渲染参数,二维投影成数字图像的过程。也就是将三维的光能传递处理转换为一个二维图像的过程。场景和实体用三维形式表示,更接近于现实世界,便于操纵和变换。
其中,待渲染的场景可以是三维场景,例如具体可以是三维虚拟场景。可以理解,在三维场景中,观测点的位置和视角不同,所展示的相应的场景画面也是不同的。通过展示连续的场景画面对应的图像帧,能够展示动态的三维场景或三维场景视频。其中,待渲染的当前帧,是表示在展示三维场景的过程中,当前需要渲染处理的图像帧。上一帧,是表示与当前帧相邻的前一帧。
可以理解,特定效果区域,是为目标不透明物体对应的区域,目标不透明物体则是当前帧中的半透明特定效果物体所覆盖的不透明物体,也就是最终在屏幕中会展示的具有特定效果对应的区域。例如,特定效果可以是预先绘制的三维虚拟场景中会出现的特殊效果,也就是会产生特殊的视觉特效果。例如,半透明特定效果物体可以包括水面反射、水面折射、下雨、玻璃、软粒子、贴花等中的至少一种。
其中,不透明物体,可以是表示不能被有色光穿过的物体,也就是光无法通过物体找到其后面物体。半透明物体,可以是表示能够被所有色光穿过的物体,也就是具有透明度、且具有允许光通过材料而不分散的物理性质的物体。
通常而言,半透明物体是指光线可以进入其中的材质的物体,半透明物体的颜色与入射光线的颜色相同,是由透过其中的色光决定的。不透明物体的颜色是由反射的色光决定的,不透明物体只反射与其相同颜色的色光。
可以理解,特定效果区域,是当前帧中的半透明特定效果物体所覆盖的至少部分不透明物体所对应的、且用于渲染特定效果的区域。通常,一些特定的半透明物体所覆盖的区域会显示出特殊的效果。不透明物体与半透明物体所处的位置不同,最终显示的效果可能会有差异。例如不透明物体处于半透明的水面物体上,与不透明物体处于半透明的水面物体下,所显示的效果是有差异的。
其中,场景数据,是指对场景中的画面进行渲染所需的数据,例如包括颜色数据、深度数据、纹理数据、顶点数据、光照数据等中的至少一种,以基于场景数据渲染出相应的场景画面。其中,历史场景渲染数据,可以是指对历史帧中的物体进行渲染后的场景数据。上一帧对应的不透明物体的历史场景渲染数据,也就是对上一帧中的不透明物体进行渲染后所获得的场景数据。
可以理解的是,待渲染的场景中至少包括不透明物体。在一些场景中既包括不透明物体,还包括半透明物体。其中,当包括半透明物体时,可能会包括特定效果区域,例如半透明物体所覆盖的区域可能会展示出特定的效果。当待渲染的当前帧的场景中包括特定效果区域时,则获取上一帧中不透明物体的历史场景渲染数据。
s204,确定特定效果区域在历史场景渲染数据中相匹配的历史场景渲染数据。
可以理解,上一帧中的不透明物体的历史场景渲染数据,可以是上一帧中所渲染的所有不透明物体对应的历史场景渲染数据。具体地,历史场景渲染数据可以是上一帧中所有不透明物体对应的需要最终进行渲染的所确定的历史场景渲染数据。
终端则根据当前帧中的特定效果区域,从上一帧中去采样特定效果区域在历史场景渲染数据中相匹配的历史场景渲染数据。具体地,相匹配的历史场景渲染数据,可以是经过重映射的采样位置采样得到的重映射的场景数据,还可以是根据预设方式确定的采样位置进行采样得到的场景数据。
s206,基于当前帧对应的整体场景数据和相匹配的历史场景渲染数据,在与当前帧对应的单渲染通道中,渲染当前帧的场景中不透明物体、特定效果区域以及半透明物体。
可以理解,半透明物体的渲染,其本质上是渲染得到这个透明物体本身的颜色,再获取到渲染缓冲区中已有的场景数据,例如颜色数据,然后采用预设方式将二者进行混合而得。当渲染一个半透明物体的时候,渲染缓冲区已经写入了所需的场景数据。因此,半透明物体通常是在最后一步渲染。
其中,渲染通道,也即renderpass,是指对待渲染的图像帧的渲染过程,也即应用程序对应于一次向图形处理器提交的渲染指令的集合。单渲染通道,则可以理解为一个渲染通道就是渲染管线的单次运行。每个渲染通道要渲染哪些图形对象,这些渲染通道就构成了渲染管线。例如,渲染通道可以包括几何缓冲通道、光照着色通道等,以实现对图像帧的渲染处理。
在渲染场景的过程中,渲染通道可以理解为是一道道图像渲染处理工序。场景中的物体通常需要一次或多次渲染操作,每次渲染操作的结果会被累加到最终的呈现结果上。若针对同一个单渲染通道所绑定的渲染目标,缓存了待渲染的当前帧渲染所需的所有场景数据,如颜色信息、深度信息、几何信息等中的至少一种。通过这个单渲染通道就可以实现对当前帧的渲染处理,以得到最终的场景渲染结果。
具体地,终端将待渲染的当前帧所需的整体场景数据和与特定效果区域相匹配的历史场景渲染数据缓存至与当前帧对应的单渲染通道所绑定的渲染缓冲区后,则可以对当前帧进行渲染处理。具体地,终端则在同一单渲染通道中,基于渲染缓冲区中的整体场景数据渲染当前帧的场景中不透明物体和半透明物体,以及基于相匹配的历史场景渲染数据,渲染当前帧的场景中的特定效果区域,从而得到当前帧对应的具有特定效果的场景渲染结果。通过在一个渲染通道中渲染场景中的不透明物体、特定效果区域以及半透明物体,能够有效减少渲染过程中的带宽消耗。
可以理解的是,若当前帧为初始帧时,终端则直接根据与初始帧对应的整体场景数据,在与初始帧对应的单渲染通道中,渲染初始帧的场景中不透明物体、特定效果区域以及半透明物体。终端在渲染初始帧时,此时终端的启动界面还处于遮挡场景的状态,不会产生视觉影响。终端在渲染下一帧时,则读取当前帧对应的单渲染通道中的不透明物体的历史场景渲染数据,以进一步对下一帧进行渲染处理。
在一个实施例中,不透明物体、特定效果区域以及半透明物体对应的渲染顺序,可以为先渲染当前帧的场景中的不透明物体,然后渲染当前帧的场景中的特定效果区域,最后渲染当前帧的场景中的半透明物体。由此能够在不拆分不透明物体与半透明物体的渲染通道的情况下,仍能有效地渲染需要场景数据,如颜色和深度信息的一些特殊效果的渲染处理。
在一个实施例中,可以采用延迟渲染的方式进行图像渲染处理,即采用延迟渲染管线进行图像渲染处理。通过将不接受光照的场景先渲染到几何缓冲区,几何缓冲区可以用于将场景数据渲染到待渲染图像帧中图形对象对应的纹理中。然后由几何缓冲区将场景数据渲染到待渲染图像帧中图形对象对应的纹理中,再对渲染到纹理中的场景数据进行光照处理。对于光源和物体数量较多的场景,采用延迟渲染方式可以极大减少像素着色器的计算压力,能够有效提升多光源场景的渲染效率。
上述场景渲染方法中,当待渲染的当前帧的场景中包括特定效果区域时,终端则获取与上一帧对应的单渲染通道中的不透明物体的历史场景渲染数据。其中,特定效果区域,是当前帧中的半透明特定效果物体所覆盖的至少部分不透明物体所对应的、且用于渲染特定效果的区域。终端通过确定特定效果区域在历史场景渲染数据中相匹配的历史场景渲染数据,能够精准地采样得到特定效果区域在上一帧中相匹配的历史场景渲染数据。进而基于当前帧对应的整体场景数据和相匹配的历史场景渲染数据,通过在与当前帧对应的同一个单渲染通道中渲染不透明物体、特定效果区域以及半透明物体。从而能够有效得到渲染精准度较高的整体场景渲染数据,并将整体场景渲染数据以及整体场景渲染数据中的不透明物体的场景渲染数据,写入与当前帧对应的单渲染通道绑定的渲染缓冲区中,进而能够高效精准地渲染出具有特定效果的图像帧,同时有效减少了渲染过程中的带宽压力,从而有效降低了渲染过程中的资源消耗。
在一个实施例中,确定特定效果区域在历史场景渲染数据中相匹配的历史场景渲染数据,包括:确定特定效果区域在上一帧中所对应的采样位置;根据采样位置对历史场景渲染数据进行采样处理,得到特定效果区域在历史场景渲染数据中相匹配的历史场景渲染数据。
其中,采样位置,可以是指在图像帧中的需要进行采样的取样位置。例如,图像帧可以表示为图像矩阵,图像帧中的每个像素具有相应的像素位置。通过采样位置对图像帧进行采样,可以获取图像帧中与采样位置相匹配的像素的场景数据。
终端获取上一帧中不透明物体的历史场景渲染数据后,通过特定效果区域在当前帧中对应的位置,计算在上一帧中的采样位置,然后根据采样位置从上一帧的历史场景渲染数据中采样相应位置的历史场景渲染数据。
具体地,终端获取上一帧中不透明物体的历史场景渲染数据后,则确定特定效果区域中的不透明物体,在上一帧中所对应的采样位置,进而根据采样位置对历史场景渲染数据进行采样处理,以从上一帧的历史场景渲染数据中获取与特定效果区域相匹配的历史场景渲染数据。
在另一个实施例中,终端获取上一帧中不透明物体的历史场景渲染数据后,还可以根据当前帧中的不透明物体对应的整体区域,确定当前帧中的不透明物体,在上一帧中所对应的采样位置,以根据采样位置从上一帧中获取与当前帧相匹配的历史场景渲染数据。
具体地,终端可以根据不同的特定效果类型,采用不同的方式确定采样位置。例如,采样方式可以包括通过当前帧对应的屏幕位置进行重映射处理确定采样位置,以及根据当前帧对应的法限或坐标偏移量确定采样位置等。
本实施例中,终端通过确定的特定效果区域在上一帧中所对应的采样位置,由此根据采样位置对上一帧的历史场景渲染数据进行采用,能够精准地采样得到在上一帧中与特定效果区域相匹配的历史场景渲染数据。
在一个实施例中,采样位置包括采样坐标;确定特定效果区域在上一帧中所对应的采样位置,包括:根据当前帧对应的投影矩阵,确定特定效果区域对应的三维场景位置;根据三维场景位置和上一帧对应的投影矩阵进行位置变换,得到重映射后的特定效果区域在上一帧中所对应的采样坐标。
其中,采样坐标可以是屏幕坐标。可以理解,可以将用于在终端进行展示的屏幕窗口作为屏幕坐标系,屏幕坐标,可以是在屏幕坐标系中的位置坐标。例如,在屏幕坐标系中,x轴在视图的水平方向并且正向向右,y轴在视图的垂直方向并且正向向上,z轴垂直于屏幕。
可以理解,重映射,可以是指将源图像中一个位置的像素放置到目标图像中指定位置的过程。通常源图像与目标图像的像素坐标不是一一对应的,因此需要获得重映射对应的像素坐标。本实施例中,源图像为上一帧图像,目标图像则为当前帧图像。通过建立上一帧图像与当前帧图像对应的映射矩阵,进而根据映射矩阵进行重映射处理,以将从上一帧图像中映射的历史场景渲染数据,映射至当前帧图像中进行渲染处理。
其中,投影矩阵,可以表示在三维空间中的物体的三维坐标与二维投影平面的投影映射矩阵。因此,投影矩阵可以用于将三维坐标映射到二维坐标。投影矩阵可以包括投影映射关系以及映射参数等信息。
可以理解,三维场景位置,可以是指物体在三维场景的世界坐标系中的位置。世界坐标系,又称世界空间,可以用于表示三维场景中各物体的世界空间位置。通常三维场景中各物体的世界坐标是固定不变的。
终端在确定特定效果区域在上一帧中所对应的采样位置的过程中,可以通基于对当前帧对应的投影矩阵,与上一帧对应的投影矩阵进行重映射处理,以得到在上一帧中所对应的采样位置。
具体地,终端可以根据当前帧对应的投影矩阵,确定特定效果区域对应的三维场景位置,也就是根据当前帧的投影矩阵确定出特定效果区域的不透明物体的世界坐标。终端进而根据三维场景位置和上一帧对应的投影矩阵进行位置变换,得到重映射后的特定效果区域在上一帧中所对应的采样坐标。例如,终端可以通过当前帧中不透明物体的世界坐标与上一帧的投影矩阵相乘,就可以得到这个不透明物体在上一帧中的屏幕坐标,即在屏幕空间的位置。终端则可以将计算得到的屏幕坐标确定为采样坐标,从而获得基于重映射处理得到的采样坐标。
本实施例中,通过基于重映射处理,根据当前帧的投影矩阵算出当前帧中不透明物体的世界坐标,利用不透明物体的世界坐标与上一帧的投影矩阵进行矩阵变换,从而能够精准地得到当前帧中不透明物体在上一帧中的屏幕坐标。
在一个实施例中,根据当前帧对应的投影矩阵,确定特定效果区域对应的三维场景位置,包括:当特定效果区域包括反射效果区域时,根据当前帧对应的投影矩阵,确定当前帧中的相机视角和反射效果区域的反射位置;根据当前帧中的相机视角和反射效果区域的反射位置,确定对称反射射线;根据对称反射射线,确定反射效果区域对应的三维场景位置。
可以理解,反射效果,是指在光滑表面材质的物体的表面上会呈现出反射周围的环境的效果,也就是可以反射周围物体的倒影。例如,光滑表面材质的物体可以包括水面、光滑地面、金属表面等中的至少一种。在渲染场景的过程中,将光滑表面材质的物体加上反射效果,能够有效提升场景的画面渲染效果和准确性。
其中,反射效果区域,可以是指场景中具有反射界面的区域,这部分区域能够呈现出具有反射的物体的特殊效果。相机视角,可以是指三维场景中的虚拟相机的视角,也可以是指三维场景中的观测点的视角。反射位置,可以是指光滑表面材质的物体的表面,例如水面的位置。反射射线,可以是指光线射向光滑表面,在光滑表面处发生反射的光线。
具体地,对于反射效果区域,终端可以采用屏幕空间的反射原理,根据当前帧对应的投影矩阵,确定当前帧中的相机视角和反射效果区域的反射位置,以及反射位置的法线方向。根据当前帧中的相机视角和反射位置,以及反射位置的法线方向,可以得到反射射线。通过取反射射线上一段距离的一个点,就可以得到与反射位置周围物体对称的点,进而根据这个点的屏幕坐标和当前帧对应的投影矩阵,就可以得到反射效果区域中需要反射的像素点的世界坐标,也就是在反射效果区域中需要反射的像素点的三维场景位置。
终端进而根据反射效果区域中需要反射的像素点的世界坐标,以及上一帧中的投影矩阵,就可以得到需要反射的像素点在上一帧中的屏幕坐标,进而可以得到反射效果区域中需要反射的像素点在上一帧中的屏幕坐标。
例如,以反射效果区域为水面时为例,如图3所示,为三维场景中采用上述方式渲染后的图像帧。从图中可以看出该场景中包括沙滩、人物、水面区域以及远处的山和天空。其中,包括水面区域3a,以及需要在水面区域3a反射倒影的反射物体区域3b。由于水面区域是光滑表面,因此需要渲染出水面区域周围反射的物体的倒影,能够有效提升场景的画面渲染效果。
本实施例中,通过根据反射区域对应的发射射线确定需要反射的不透明物体的三维场景位置后,则可以精准地从上一帧中的历史场景渲染数据中采样得到重映射后的场景数据。由此能够有效实现在减少渲染过程中的资源消耗以提高渲染效率的同时,还能够有效提高场景渲染的精准度。
在一个实施例中,确定特定效果区域在上一帧中所对应的采样位置,包括:当特定效果区域包括折射效果区域时,根据当前帧中的相机视角和折射效果区域对应的法线方向,确定采样坐标偏移量;根据采样坐标偏移量,确定折射效果区域在上一帧中所对应的采样位置。
可以理解,折射效果,可以是指光线从一种透明介质斜射入另一种透明介质时,传播方向一般会发生变化,并且会在另一种半透明介质中呈现出具有折射现象的效果。例如,折射效果区域可以是具有透明度的材质的物体,例如可以包括水面、玻璃等半透明物体中的至少一种。
具体地,对于折射效果区域,终端可以采用屏幕空间的反射原理,根据当前帧对应的投影矩阵,确定当前帧中的相机视角和反射效果区域的反射位置对应的法线方向,根据几何关系可以得到一个相对偏移量。例如可以根据反射位置的波形,计算折射后的相对偏移量。终端则将得到的相对便宜量确定为用于在上一帧中进行采样的采样坐标偏移量。终端进而根据采样坐标偏移量,确定折射效果区域在上一帧中所对应的采样位置。
终端进而根据折射效果区域在上一帧中所对应的采样位置,以及上一帧中的投影矩阵,就可以得到折射效果区域中需要折射的像素点在上一帧中的屏幕坐标。然后根据采样坐标对上一帧的历史场景渲染数据进行采样处理,以从上一帧的历史场景渲染数据中获取与特定效果区域相匹配的历史场景渲染数据。
例如,对于当前帧中的折射效果区域,例如场景中的水面区域,可以通过光线追踪的方式确定采样坐标偏移量,具体地,可以根据三维场景中的入射平面法线、角度和折射率计算出射角,然后根据射角计算出采样坐标偏移量,进而根据采样坐标偏移量进一步对上一帧的历史场景渲染数据进行采样,得到相匹配的历史场景渲染数据。
基于当前帧对应的整体场景数据和相匹配的历史场景渲染数据进行渲染时,则是先渲染出不透明物体部分,在渲染折射效果区域的时候,例如折射效果区域为水面时,对每个像素根据屏幕空间法线等属性得到采样的像素位置偏移量,得到水面对应的折射后的像素值,然后与水面本身的着色进行混合,以渲染出折射的效果。
可以理解的是,若在包括折射场景中采用重映射的历史场景渲染数据,也就是采用基于重映射处理确定采样位置,从历史场景渲染数据中采样的历史场景渲染数据进行渲染的方式。采用这种方式渲染后,当三维场景中的视角快速转动时,如图4所示,参照图4,渲染得到的图像帧中包括水面区域。其中,水面区域中的区域4a是正常的渲染结果,但水面区域的边缘产生了类似于拉丝的瑕疵区域4b。
本实施例中,通过基于采样坐标偏移量从上一帧中采样相应的历史场景渲染数据进行渲染的方式,则可以解决视角快速转动时,图像边缘产生瑕疵的问题。如图5所示,渲染得到的图像帧则不会产生拉丝的瑕疵。
在其中一个实施例中,如图6所示,渲染后的图像帧中地面树的投影,是正常情况。当三维场景中的视角快速转动时,通过采用未经过重投影的上一帧的场景数据进行折射处理,视觉上会有一个晃动延迟,尤其在浅水处较为明显。如图7所示,渲染后的图像帧中地面树的投影出现了重影的瑕疵。在另一个实施例中,若重影的瑕疵较大时,可以不做水面的折射渲染处理,仅保留反射渲染处理。
本实施例中,针对场景中的折射效果区域,通过计算出折射效果区域对应的采样坐标偏移量,从而确定出需要反射的不透明物体的三维场景位置,则可以精准地从上一帧中的历史场景渲染数据中采样得到相匹配的历史场景渲染数据。由此能够有效实现在减少渲染过程中的资源消耗以提高渲染效率的同时,还能够有效提高场景渲染的精准度。
在一个实施例中,获取与上一帧对应的单渲染通道中的不透明物体的历史场景渲染数据,包括:获取与上一帧对应的单渲染通道绑定的渲染缓冲区中的不透明物体的历史场景渲染数据。
上述场景渲染方法还包括:将渲染当前帧后得到的整体场景渲染数据、以及整体场景渲染数据中的不透明物体的场景渲染数据,写入与当前帧对应的单渲染通道绑定的渲染缓冲区中。
其中,渲染缓冲区,即渲染目标(rt,rendertarget),渲染目标是用于渲染像素的显存缓冲区,用来记录渲染后的输出的结果,具体可以是指用于在渲染图像帧时存储所需要绘制的信息的显存缓冲区,而不直接将帧缓冲绘制到屏幕。
可以理解的是,渲染目标,实质上是一个连续的内存区域,这样的内存区域可以同时的存在多个,也就是多个渲染目标。在3d(三维)计算机图形领域,渲染目标,用于图形处理器(gpu,graphicsprocessingunit)将3d场景渲染过程中的场景数据缓存到中间存储缓冲区或渲染目标纹理(rtt,rendertargettexture),而不是帧缓冲区或后缓冲区。然后可以通过像素着色器操从渲染目标中读取所需的信息,以便在显示最终图像之前将其他效果应用于最终图像帧。例如,离屏渲染,就可以通过渲染目标实现。
例如,终端中的显卡通过渲染缓冲区中的信息,采用预设方式绘制场景的像素。具体地,可以通过创建一个或多个渲染目标,在渲染缓冲区中保留一块新区域存储用于绘制所需的信息。例如,在一些三维游戏场景中,可以将大量的场景数据绘制到多个渲染目标内,通过编译不同的图像元素对应的场景数据,然后将这些图像元素组合起来构成最终的用于渲染的帧缓冲。
可以理解的是,渲染缓冲区用于离线缓存正在渲染处理后的图像帧所需的场景渲染数据。帧缓存则是用于存储每个像素的色彩,即渲染后的图像帧。帧缓存常常在显存中,显卡通过不断读取显存的帧缓存中已经渲染好的图像帧,就可以在终端的屏幕中进行显示渲染后的图像帧。
具体地,一个单渲染通道可以绑定多个渲染缓冲区。其中,多个是指两个以上。也就是一个单渲染通道可以绑定至少两个渲染缓冲区。例如,渲染缓冲区中可以至少包括颜色缓冲(colorrt)和深度缓冲(depthrt),还可以包括模板缓冲(stencilrt)。其中,深度缓冲与模板缓冲还可以是合并的一个缓存区(depth&stencilrt)。颜色缓冲用于存储像素的颜色数据。深度缓冲用于存储像素的深度数据,深度数据反映了物体到摄像机的距离。模板缓冲可以用于存储位图标记数据,例如可以用于针对标记的特定效果区域实现特殊效果。
可以理解,终端通过在当前帧对应的单渲染通道中,渲染当前帧的场景中不透明物体、特定效果区域以及半透明物体,得到当前帧对应的整体场景渲染数据后。终端则将整体场景渲染数据,以及整体场景渲染数据中的不透明物体的场景渲染数据,缓存至与当前帧的单渲染通道绑定的渲染缓冲区中。
与当前帧的单渲染通道绑定的渲染缓冲区中的不透明物体的历史场景渲染数据,则可以提供给下一帧对应的单渲染通道读取,以采用上述方式继续对下一帧进行渲染处理。
若待渲染的当前帧的场景中包括特定效果区域,且当前帧不为第一帧时,终端则从与上一帧对应的单渲染通道绑定的渲染缓冲区中,读取上一帧中不透明物体的历史场景渲染数据,以从上一帧中不透明物体的历史场景渲染数据中获取相匹配的历史场景渲染数据。终端则基于当前帧对应的整体场景数据和相匹配的历史场景渲染数据,在与当前帧对应的单渲染通道中,渲染当前帧的场景中不透明物体、特定效果区域以及半透明物体。终端进而将渲染当前帧后得到的整体场景渲染数据、以及整体场景渲染数据中的不透明物体的场景渲染数据,写入与当前帧对应的单渲染通道绑定的渲染缓冲区中。
本实施例中,通过将整体场景渲染数据以及整体场景渲染数据中的不透明物体的场景渲染数据,写入与当前帧对应的单渲染通道绑定的渲染缓冲区中,由此能够有效实现在一个渲染通道中渲染不透明物体、特定效果区域以及半透明物体,进而能够高效精准地渲染出具有特定效果的图像帧,有效降低了渲染过程中的资源消耗。
在一个实施例中,渲染缓冲区包括整体场景缓冲区和不透明物体缓冲区;获取与上一帧对应的单渲染通道绑定的渲染缓冲区中的不透明物体的历史场景渲染数据,包括:从上一帧对应的单渲染通道所绑定的不透明物体缓冲区中,获取上一帧中不透明物体的历史场景渲染数据。将渲染当前帧后得到的整体场景渲染数据以及整体场景渲染数据中的不透明物体的场景渲染数据,写入与当前帧对应的单渲染通道绑定的渲染缓冲区中的步骤,包括:将渲染当前帧后得到的整体场景数据,缓存至与当前帧的单渲染通道绑定的整体场景缓冲区中;将整体场景渲染数据中的不透明物体的场景渲染数据,缓存至与当前帧的单渲染通道绑定的不透明物体缓冲区中。
其中,渲染缓冲区中包括的整体场景缓冲区,用于缓存当前帧对应的渲染后的所有物体的整体场景渲染数据。渲染缓冲区中包括的不透明物体缓冲区,用于缓存当前帧对应的整体场景渲染数据中的不透明物体对应的场景渲染数据。也就是整体场景缓冲区中缓存了当前帧对应的整体场景渲染数据,不透明物体缓冲区中再另外缓存了当前帧对应的整体场景渲染数据中的不透明物体的场景渲染数据。
可以理解,每一帧都会被分配一个对应的单渲染通道。每一帧对应的单渲染通道可以绑定多个渲染目标,即可以绑定多个渲染缓冲区。具体地,每一帧对应的单渲染通道至少绑定一个整体场景缓存区和不透明物体缓冲区。
终端通过着色器对每一帧进行渲染后,将渲染每一帧后得到的整体场景渲染数据,以及整体场景渲染数据中的不透明物体对应的场景渲染数据,写入与各帧相应的单渲染通道所绑定的渲染缓冲区中。
具体地,终端在与当前帧对应的单渲染通道中,渲染当前帧的场景中不透明物体、特定效果区域以及半透明物体后,得到渲染后的整体场景渲染数据。终端则将渲染当前帧后得到的整体场景渲染数据,缓存至与当前帧的单渲染通道绑定的整体场景缓冲区中。
终端然后将整体场景渲染数据中的不透明物体对应的场景渲染数据,缓存至与当前帧的单渲染通道绑定的不透明物体缓冲区中。由此,终端根据当前帧对应的采样位置从上一帧中进行采样时,从上一帧对应的单渲染通道所绑定的不透明物体缓冲区中读取不透明物体对应的历史场景渲染数据。
具体地,可以采用一个renderpass绑定多个rt(rendertarget,渲染目标,也即渲染缓冲区),渲染缓冲区中可以包括多个不同类型的子缓冲区,例如颜色缓冲区(colorrt)、深度缓冲区(depthrt)以及模板缓冲区(stencilrt)。
可以理解,渲染缓冲区中可以包括整体场景缓冲区和不透明物体缓冲区。其中,整体场景缓冲区中可以包括一个颜色缓冲区(colorrt)、一个深度缓冲区(depthrt)和一个模板缓冲区(stencilrt),深度缓冲区(depthrt)和模板缓冲区(stencilrt)也可以为一个合并的缓冲区(depth&stencilrt),用于缓存当前帧中所有物体的整体场景渲染数据,整体场景渲染数据可以包括所有物体的颜色信息、深度信息和mask标记信息。不透明物体缓冲区则可以包括一个颜色缓冲区(opaquecolorrt)和一个深度缓冲区(opaquedepthrt),用于缓存渲染后的当前帧对应的整体场景渲染数据中的不透明物体的场景渲染数据,具体可以包括所有不透明物体的颜色信息和深度信息。
在一个具体的实施例中,如图8所示,为第n帧、第n+1帧和第n+2帧分别对应的渲染缓冲区的示意图和数据读取示意图。其中,每一帧对应的单渲染通道都绑定五个渲染目标。其中3个rt为整体场景缓冲区,包括颜色缓冲区(colorrt)以及包括深度缓冲区与模板缓冲区的合并缓冲区(depth&stencilrt),用于缓存当前帧中所有物体的颜色信息、深度信息和模板信息。其中,stencil是一个mask标记,占8位,用于实现一些特殊渲染效果。另两个rt为不透明物体缓冲区,包括一个颜色缓冲区(opaquecolorrt)和一个深度缓冲区(opaquedepthrt),分别保存不透明物体的颜色和深度,作为下一帧的输入。
参照图8,第n帧对应的渲染缓冲区包括整体场景缓冲区80a和不透明物体缓冲区80b;第n+1帧对应的渲染缓冲区包括整体场景缓冲区81a和不透明物体缓冲区81b;第n+2帧对应的渲染缓冲区包括整体场景缓冲区82a和不透明物体缓冲区82b。当第n+1帧从第n帧中获取不透明物体对应的历史场景渲染数据时,则从不透明物体缓冲区80b中的颜色缓冲区(opaquecolorrt)和深度缓冲区(opaquedepthrt)读取所需的历史场景渲染数据。当第n+2帧从第n+1帧中获取不透明物体对应的历史场景渲染数据时,则从不透明物体缓冲区81b中的颜色缓冲区(opaquecolorrt)和深度缓冲区(opaquedepthrt)读取所需的历史场景渲染数据。
由于终端中的硬件限制了同一个缓冲区不能又读又写,因此,对于不透明物体缓冲区中的两个缓冲区,可以采用pingpong读取方式,可以表示为类似于乒乓属性的数据读取方式。例如,可以在当前帧读m缓冲区写n缓冲区,在下一帧则读n缓冲区写m缓冲区。
在其中一个实施例中,如图9所示,为处理当前帧时从上一帧读取场景数据的示意图。其中,第n帧为当前帧,第n-1帧为上一帧,上一帧对应的单渲染通道绑定的渲染缓冲区包括整体场景缓冲区90a和不透明物体缓冲区90b。整体场景缓冲区90a缓存了上一帧对应的渲染后的整体场景渲染数据,不透明物体缓冲区90b缓存了上一帧对应的渲染后的整体场景渲染数据中的不透明物体的场景渲染数据。当前帧对应的单渲染通道绑定的渲染缓冲区包括整体场景缓冲区91a和不透明物体缓冲区91b。终端在渲染当前帧的过程中,从上一帧对应的不透明物体缓冲区90b中读取上一帧对应的渲染后的整体场景渲染数据中的不透明物体的历史场景渲染数据,以进一步对读取的上一帧的历史场景渲染数据进行重映射处理。具体地,当终端支持subsspass功能时,也就是当单渲染通道中包括子渲染通道时,若当前帧包括折射效果区域,例如渲染水面时,终端还可以通过子渲染通道读取当前帧对应的场景数据,以进一步利用当前帧对应的场景数据,对上一帧的历史场景渲染数据进行重映射后的场景数据进行矫正。
若当前帧包括的特定效果区域中的半透明特定效果物体包括软粒子或贴花时,若终端不支持subsspass功能时,终端则直接读取上一帧的历史场景渲染数据进行重映射处理,并利用重映射后的历史场景渲染数据渲染特定效果区域。若终端支持subsspass功能时,终端则通过子渲染通道读取当前帧对应的场景数据渲染特定效果区域。
在其中一个实施例中,颜色缓冲区中可以采用rgb565的图像数据格式存储不透明物体的颜色信息。可以理解,rgb565的图像数据格式对于颜色精度的要求不高,例如可以用于水面的反射渲染处理和折射渲染处理。深度缓冲区中可以采用r16f的图像数据格式存储不透明物体的深度信息。
由于不同类型的图形接口对于图形处理器中的缓冲区的支持兼容性不同,例如,在大多数主流图形接口中,对于depthbufferfetch(深度缓冲区读取属性)的支持兼容性不如colorbuffer(颜色缓冲区读取属性),如metal类型的图形接口则不支持depthbufferfetch(深度缓冲区读取属性)。因此,本实施例中,通过在但渲染通道中再另外绑定一个颜色缓冲区(opaquecolorrt)和一个深度缓冲区(opaquedepthrt),将从上一帧读取的颜色信息和深度信息分别缓存至颜色缓冲区和深度缓冲区,则能够有效解决不同类型的图形接口的支持兼容性的问题。并且深度缓冲区还可以缓存一些其他信息,例如可以用正负号区分是动态物体的深度还是静态物体的深度。
本实施例中,通过将每一帧对应的单渲染通道中绑定多个缓冲区,从而可以将当前帧的整体场景渲染数据和整体场景渲染数据中的不透明物体的场景渲染数据,缓存至与当前帧的单渲染通道绑定的渲染缓冲区中,由此能够高效地实现在同一渲染通道中渲染不透明物体、特定效果区域以及半透明物体。
在一个实施例中,基于当前帧对应的整体场景数据和相匹配的历史场景渲染数据,在与当前帧对应的单渲染通道中,渲染当前帧的场景中不透明物体、特定效果区域以及半透明物体的步骤,包括:基于当前帧对应的整体场景数据,在与当前帧对应的单渲染通道中渲染当前帧的场景中的不透明物体;基于相匹配的历史场景渲染数据,在单渲染通道中渲染当前帧的场景中的特定效果区域;基于整体场景数据,在单渲染通道中渲染当前帧的场景中的半透明物体,得到当前帧对应的整体场景渲染数据。
其中,终端在对三维场景中的各图像帧进行渲染处理时,可以通过渲染引擎进行渲染处理。其中,渲染引擎在渲染的过程中,需要使用渲染缓冲区中缓存的与各图像帧相关场景数据。例如,需要指定多少个颜色和深度缓冲区中的颜色、深度等场景数据将会被使用,指定多少个采样器被用到及在整个渲染操作中相关的内容如何处理。
本实施例,可以将各图像帧所需的场景数据封装至与各图像帧对应的渲染通道的对象中,具体则通过对渲染通道绑定多个渲染缓冲区,并将渲染后的各图像帧对应的场景渲染数据缓存至相应的渲染缓冲区中,由此在渲染下一帧的过程中,则从当前帧对应的单渲染通道绑定的缓冲区中读取所需的历史场景渲染数据,以对下一帧继续进行渲染处理。
终端获取待渲染的当前帧所需的整体场景数据和与特定效果区域相匹配的历史场景渲染数据后,则可以对当前帧进行渲染处理。
具体地,终端则在同一单渲染通道中,先渲染不透明物体,然后根据重映射后的不透明物体的相匹配的历史场景渲染数据渲染特殊效果物体,再渲染半透明物体,得到当前帧对应的渲染结果。具体地,终端在同一单渲染通道中,根据当前帧对应的整体场景数据,渲染当前帧的场景中的不透明物体。然后基于相匹配的历史场景渲染数据,渲染当前帧的场景中的特定效果区域。最后再基于整体场景数据,渲染当前帧的场景中的半透明物体,从而能够高效地在同一个单渲染通道中进行渲染,得到当前帧对应的整体场景渲染数据,进而能够高效地渲染出具有特定效果的图像帧。
本实施例中,通过在同一单渲染通道中,基于渲染缓冲区中的整体场景数据和上一帧中相匹配的历史场景渲染数据,渲染不透明躯体、特定效果区域以及半透明物体,从而能够高效地渲染出具有特定效果的图像帧,还能够有效减少渲染过程中的带宽消耗。
在一个实施例中,上述场景渲染方法还包括:当特定效果区域包括水面效果区域时,根据预设水面高度确定与水面效果区域相匹配的预设场景数据。基于当前帧对应的整体场景数据和相匹配的历史场景渲染数据,在与当前帧对应的单渲染通道中,渲染当前帧的场景中不透明物体、特定效果区域以及半透明物体,得到当前帧对应的整体场景渲染数据的步骤,包括:在渲染水面效果区域时,基于相匹配的历史场景渲染数据和预设场景数据,在单渲染通道中渲染当前帧的场景中的水面效果区域。
其中,水面效果区域,是指当前帧的场景中包括水面的场景。水面的颜色、透明度,表示水面区域对应的颜色,以及水面区域的透明度。预设水面高度,可以是指根据预先设定的三维场景中的水面场景,生成相应的预设水面高度数据。
具体地,当特定效果区域包括水面效果区域时,终端则可以直接根据预设水面高度确定与水面效果区域相匹配的预设场景数据。预设场景数据具体可以为根据水面高度从预设水面高度中获取的水面的颜色和深度。
终端进而在渲染水面效果区域时,就可以根据渲染缓冲区中的相匹配的历史场景渲染数据和预设场景数据,在单渲染通道中渲染当前帧的场景中的水面效果区域。由此使得场景中的水面效果区域对应的颜色和透明度无需依赖于实时的深度,能够更加精准有效地渲染水面效果区域。
可以理解的是,由于水面的颜色、透明度都依赖于深度。通常不同深度的水面所呈现出来的颜色效果和透明度效果不同。因此,利用从上一帧中重映射的历史场景渲染数据渲染水面效果区域时,可能会产生明显的视觉错误。如图10所示,为一个实施例中采用重映射的历史场景渲染数据渲染的水面示意图,可以看出,图10中的水面边缘区域10a的视觉瑕疵较为明显。如图11所示,为一个实施例中采用重映射的历史场景渲染数据渲染的水面示意图,可以看出,图11中的水面区域中的人物上半身出现了一些重影区域11a。
具体地,对于水面效果区域的颜色、透明度,通过预先生成的水面离地面高度图,确定水面颜色和透明度。让水面颜色、透明度不依赖于实时深度,而是通过预先生成的水面离地面高度图计算。
如图12所示,为一个实施例中水面深度的示意图。其中,当相机视角1201对应的视线方向1202朝向水面1203,以及指向水面1203下的地面1204时,传统的方式是根据视线方向1202指向的地面1204与水面1203的深度差,计算水面颜色和透明度。如图13所示,是本实施例中确定水面深度的示意图。由于预先存储了静态物体和水面的高度差。当相机视角1301对应的视线方向1302朝向水面1303,以及指向水面1303下的地面1304时,根据当前帧的相机视角1301与水面1303的夹角,计算对应的查询坐标。根据这个查询坐标就可以从预设水面高度数据中获取该水面位置对应的水面高度,得到的水面距离地面垂直高度差1304,这个高度差在视线方向上的投影的长度1305,与实际视线方向的长度存在差异。通过从预设水面高度获取水面位置相匹配的颜色深度信息,进行渲染,能够保证水面效果区域的渲染结果更加精准。
终端可以预先存储静态物体和水面的高度差,如图14所示,为一个实施例中预先存储的预设水面高度的示意图。图14中为一个包括水面区域和海岛地图的场景,地图中的水面高度图中颜色越深表示水面高度越浅,颜色越浅表示水面高度越深。其中,由于可能会有动态物体上带水面,因此纯陆地的地方颜色也是浅的。
在一个具体地实施例中,如图15所示,为采用传统方式渲染的包括水面效果区域的示意图。可以看出,在水面的折射效果和水面边缘的效果存在瑕疵。如图16所示,为采用上述方式渲染得到的水面效果区域的示意图,可以看出,水面的折射效果和水面边缘的效果更好。
本实施例中,通过根据当前帧中的视角和水面的夹角,从预设水面高度数据中查找与水面效果区域相匹配的预设场景数据,即水面颜色和深度信息,以在单渲染通道中渲染当前帧的场景中的水面效果区域。由此使得场景中的水面效果区域对应的颜色和透明度无需依赖于实时的深度,能够更加精准有效地渲染水面效果区域。
在一个实施例中,如图17所示,提供了另一种场景渲染方法,具体包括以下步骤:
s1702,当待渲染的当前帧的场景中包括特定效果区域时,特定效果区域为目标不透明物体对应的区域,目标不透明物体是当前帧中的半透明特定效果物体所覆盖的不透明物体,则获取与上一帧对应的单渲染通道绑定的渲染缓冲区中的不透明物体的历史场景渲染数据。
s1704,确定特定效果区域在历史场景渲染数据中相匹配的历史场景渲染数据;相匹配的历史场景渲染数据为基于重映射后的采样坐标所采样的第一场景渲染数据。
s1706,若当前帧对应的单渲染通道中包括子渲染通道时,通过子渲染通道获取特定效果区域对应的当前帧的场景数据。
s1708,基于当前帧对应的整体场景数据,在单渲染通道中渲染当前帧的场景中不透明物体。
s1710,在渲染特定效果区域时,根据特定效果区域对应的当前帧的场景数据和第一场景渲染数据,确定特定效果区域对应的目标场景数据。
s1712,基于目标场景数据,在单渲染通道中渲染当前帧的场景中的特定效果区域。
s1714,基于整体场景数据,在单渲染通道中渲染当前帧的场景中的半透明物体。
s1716,将渲染当前帧后得到的整体场景渲染数据、以及整体场景渲染数据中的不透明物体的场景渲染数据,写入与当前帧对应的单渲染通道绑定的渲染缓冲区中。
其中,子渲染通道,可以是指附属于一个单渲染通道里的渲染通道,子渲染通道也能够实现一个单渲染通道的功能。例如,对于不同类型的图形接口对应的渲染引擎以及不同类型的图形处理器,一些渲染引擎能够支持在一个单渲染通道里开启子渲染通道进行渲染处理,一些则无法支持子渲染通道的功能。
例如,对于vulkan类型的图形接口对应的渲染引擎,可以在一个renderpass单渲染通道中开启subpass功能,但并非真的另开了一个pass,还是在这个renderpass里。但通过这个subpass可以获得当前帧、当前渲染像素点的深度和颜色信息等场景数据,能够实现部分需要另开一个pass才能实现的功能。在本实施例中,subpass子渲染通道可以用于在渲染过程中同时进行矫正。
终端在渲染图像帧的过程中,当待渲染的当前帧的场景中包括特定效果区域时,则从上一帧中不透明物体的历史场景渲染数据获取基于重映射后的采样坐标所采样的第一场景渲染数据,并将第一场景渲染数据缓存至与当前帧的单渲染通道绑定的渲染缓冲区中。
对于具有子渲染通道功能的情形,终端可以通过子渲染通道获取与特定效果区域对应的当前帧的场景数据。终端还可以通过子渲染通道去获取当前帧中所需的当前像素的场景数据。
终端进而基于当前帧对应的整体场景数据和第一场景渲染数据,以及特定效果区域对应的当前帧的场景数据,在单渲染通道中渲染当前帧的场景中不透明物体、特定效果区域以及半透明物体。
具体地,终端首先根据渲染缓冲区中的整体场景数据,在单渲染通道中渲染当前帧的场景中不透明物体。
可以理解,目标场景数据,可以是指最终用于渲染特定效果区域的场景数据。终端在渲染特定效果区域时,则根据特定效果区域对应的当前帧的场景数据和第一场景渲染数据,确定特定效果区域对应的目标场景数据。具体可以根据第一场景渲染数据中的错误像素,利用当前帧中特定效果区域对应的场景数据进行矫正,从而得到特定效果区域对应的目标场景数据。
终端进而基于目标场景数据,在单渲染通道中渲染当前帧的场景中的特定效果区域。最后根据整体场景数据,在单渲染通道中渲染当前帧的场景中的半透明物体。
在其中一个实施例中,对于当前帧中的特定效果区域包括的水面反射区域时,可以直接根据基于重映射后的采样坐标所采样的第一场景渲染数据渲染水面反射区域。对于当前帧中的特定效果区域包括的水面折射区域时,则根据特定效果区域对应的当前帧的场景数据和重映射的第一场景渲染数据,确定水面折射区域对应的目标场景数据,以根据目标场景数据渲染水面折射区域。
本实施例中,当单渲染通道中包括子渲染通道时,通过子渲染通道获取特定效果区域对应的当前帧的场景数据,并结合从上一帧中的历史数据中基于重映射采样得到的第一场景渲染数据,确定特定效果区域的目标场景数据,以对特定效果区域进行渲染。由此不仅能够有效减少渲染过程中的带宽消耗,还能够有效提高特定效果区域的渲染精准度。
在一个实施例中,根据特定效果区域对应的当前帧的场景数据和第一场景渲染数据,确定特定效果区域对应的目标场景数据的步骤,包括:当特定效果区域包括折射效果区域时,确定第一场景渲染数据对应的待矫正像素点;根据特定效果区域对应的当前帧的场景数据中的与待矫正像素点对应的场景数据,替换待矫正像素点在第一场景渲染数据中对应的场景数据,得到特定效果区域的对应目标场景数据。
其中,待矫正像素点,可以是指基于第一场景渲染数据渲染特定效果区域的渲染结果中存在瑕疵的像素点,例如存在像素缺失、物体重影等瑕疵情况的像素点,这部分像素点则为需要进行矫正处理的待矫正像素点。
可以理解的是,由于折射效果区域发渲染处理较为特殊,当特定效果区域包括折射效果区域时,利用上一帧重映射得到的第一场景渲染数据渲染折射效果区域可能会存在瑕疵的情况。
终端通过单渲染通道中的子渲染通道获取特定效果区域对应的当前帧的场景数据后,则根据基于上一帧重映射得到的第一场景渲染数据,以及特定效果区域对应的当前帧的场景数据,确定特定效果区域对应的目标场景数据。例如,终端可以利用特定效果区域对应的当前帧的场景数据,对做重映射的第一场景渲染数据中有误差的部分待矫正像素点进行矫正。
具体地,终端可以首先利用基于上一帧重映射得到的第一场景渲染数据确定特定效果区域中各像素点的场景数据。终端进而检测特定效果区域中各像素点中存在瑕疵的待矫正像素点。然后利用特定效果区域对应的当前帧的场景数据中的与待矫正像素点对应的场景数据,替换待矫正像素点在第一场景渲染数据中对应的场景数据,得到特定效果区域对应的目标场景数据。
在另一个实施例中,终端还可以首先利用基于上一帧重映射得到的第一场景渲染数据渲染特定效果区域,得到特定效果区域对应的初步渲染结果。终端进而检测初步渲染结果中存在瑕疵的待矫正像素点。终端然后利用特定效果区域对应的当前帧的场景数据中的与待矫正像素点对应的场景数据,替换待矫正像素点在第一场景渲染数据中对应的场景数据,得到特定效果区域对应的目标场景数据,进而利用目标场景数据渲染特定效果区域,以得到特定效果区域对应的最终的场景渲染数据。
在其中一个实施例中,终端检测初步渲染结果中存在瑕疵的待矫正像素点时,基于重映射的第一场景渲染数据,得到的当前帧中特定效果区域对应的像素点后,可以通过检测当前帧中各像素点对应的屏幕坐标,通过判断各像素点对应的屏幕坐标值,确定当前帧中的待矫正像素点。例如,当前帧中的像素点对应的屏幕坐标小于0或大于1时,表示是像素位置错误的像素点,则将该像素点确定为待矫正像素点。例如,参照上述图4中的水面场景,水面边缘区域存在拉丝的瑕疵,表示这部分像素的像素位置发生错误。对于这种情况,终端则可以利用当前帧对应的场景数据对该部分待矫正像素点进行补齐,也就是将这部分像素替换为当前帧中对应位置的场景数据。
如图18所示,为采用本实施例的方式对水面区域中像素位置发生错误的区域18a和区域18b中对应的待矫正像素点进行矫正后的示意图,参照图18,水面区域的边缘用深色标记的部分区域,则为当前帧中对应位置的场景数据补齐后的效果。
本实施例中,通过利用特定效果区域对应的当前帧的场景数据,对基于重映射的第一场景渲染数据中产生瑕疵的待矫正像素点进行矫正,能够有效提高对场景进行渲染的精准度。
在一个实施例中,确定渲染缓冲区中的第一场景渲染数据对应的待矫正像素点,包括:当第一深度值大于第二深度值时,判定像素点为待矫正像素点;其中,第一深度值,是第一场景渲染数据中像素点的深度值;第二深度值,是特定效果区域对应的当前帧的场景数据中的折射交界面的深度值。
其中,第一深度值,是指基于从上一帧中的历史场景渲染数据中重映射得到的第一场景渲染数据中的折射交界面像素点的深度值。第二深度值,是指特定效果区域对应的当前帧的场景数据中的折射交界面的深度值。例如,折射交界面可以包括水面等场景。
可以理解的是,渲染缓冲区中可以包括深度缓存。深度缓存中存储了像素的深度信息,深度信息反映了物体到观测点的距离,可以用于计算物体之间的遮挡。在渲染的过程中,可以计算各像素的插值深度。在渲染像素之前,将这个深度值和深度缓存中该像素的深度值比较,如果新的深度比现有值离观测点更远,表示这部分像素可能存在瑕疵,则需要丢弃新的像素。
终端在检测特定效果区域的像素点中存在瑕疵的待矫正像素点时,根据第一深度值和第二深度值确定特定效果区域中的待矫正像素点。
具体地,当第一深度值大于第二深度值时,表示重映射得到的第一场景渲染数据中的折射交界面像素点的深度值,比特定效果区域对应的当前帧的场景数据中的折射交界面的深度值近,表示这部分像素应该在折射交界面上面,不应该被折射。因此,终端则将第一深度值大于第二深度值这部分像素确定为待矫正像素点。进而利用特定效果区域对应的当前帧的场景数据对这部分待矫正像素点进行替换,从而得到渲染精准度较高的特定效果区域的目标场景数据。
在一个实施例中,确定渲染缓冲区中的第一场景渲染数据对应的待矫正像素点,包括:确定第一深度值与第二深度值之间的第一深度差值;基于采样坐标偏移量,从历史场景渲染数据中采样与特定效果区域相匹配的第二场景渲染数据;确定同一像素点在第一场景渲染数据和第二场景渲染数据中的第二深度差值;当第一深度差值大于或等于第一阈值、且第二深度差值大于或等于第二阈值时,判定像素点为待矫正像素点。
其中,深度差值,可以是指将两种深度信息进行比较得到的误差值。
可以理解,第一场景渲染数据为基于重映射从上一帧中的历史场景渲染数据中进行采样得到的与特定效果区域相匹配的历史场景渲染数据。第二场景渲染数据为基于采样坐标偏移量,从历史场景渲染数据中采样与特定效果区域相匹配的历史场景渲染数据。
终端在检测特定效果区域的像素点中存在瑕疵的待矫正像素点时,还可以根据采用不同方式从上一帧中采样得到的第一场景渲染数据和第二场景渲染数据,分别将第一场景渲染数据和第二场景渲染数据,与当前帧中场景数据的深度值进行比较,以确定特定效果区域中的待矫正像素点。
可以理解的是,第一阈值和第二阈值可以相同,也可以不同。
具体地,终端可以首先确定第一深度值与第二深度值之间的第一深度差值,然后确定同一像素点在第一场景渲染数据和第二场景渲染数据中的第二深度差值。终端则进一步对第一深度差值和第二深度差值进行判断。具体地,当第一深度差值大于或等于第一阈值、且第二深度差值大于或等于第二阈值时,表示第一场景渲染数据中的深度值远远比特定效果区域对应的当前帧的场景数据中的深度值近,表示这部分像素出现了重影,则判定这部分像素点为待矫正像素点。并且第二深度差值大于或等于第二阈值时,表示这部分像素的扭曲程度不够,则判定这部分像素点为待矫正像素点。若第二深度差值不够大时,则表示这部分像素对应物体的轮廓的扭曲,可以将这部分轮廓扭曲的像素不被判定待矫正像素点。
本实施例中,通过利用当前帧中特定效果区域对应的场景数据,对基于重映射的第一场景渲染数据中产生瑕疵的待矫正像素点进行矫正,不仅能够精准地矫正具有瑕疵的像素点,还能够有效渲染出折射效果区域的轮廓扭曲效果,能够有效提高了场景渲染的精准度。
在一个具体的实施例中,当特定效果区域包括折射效果区域时,若采用基于从上一帧中的历史场景渲染数据中重映射得到的第一场景渲染数据,渲染折射效果区域,可能会出现错误的物体重影的情况。
例如,以折射效果区域为水面效果区域为例,采用基于从上一帧中的历史场景渲染数据中重映射得到的第一场景渲染数据,渲染水面效果区域。当相机视角快速变化时,如图19所示,水面效果区域中包括人物、水底地面和水面,渲染得到的水面区域出现了错误的物体重影区域19a。
对于这种情况,终端则可以利用当前帧的场景数据对这部分错误的像素进行补齐。例如,可以采用分步补齐的方式对产生瑕疵的待矫正像素点逐步进行矫正。
(1)首先去除不透明物体在水平面上的部分的重影。
具体地,终端首先判定哪些像素是需要进行矫正的待矫正像素点。可以通过如下表达式进行判定水平面上的重影的像素点:
boolmiss=devicereprojz>waterz;
其中,boolmiss表示待矫正像素点,devicereprojz表示基于从上一帧中的历史场景渲染数据中,重映射得到的第一场景渲染数据中的折射交界面像素点的深度值。waterz表示当前帧对应的场景数据中的折射交界面的深度值。
当devicereprojz大于waterz,表示基于重映射的第一场景渲染数据得到的深度值比水面像素的深度值近,说明这部分应该是在水面上的,不应该被折射,则被判定为待矫正像素点。并利用当前帧中对应位置的场景数据,对待矫正像素点的场景数据进行替换,以去除水面上的重影。如图20所示,为去除水面上的重影瑕疵后的示意图,但物体在水平面下的仍有部分的重影区域20a。
(2)接着,终端进一步去除物体在水平面下的部分的重影。可以通过如下表达式进行判定水平面下重影的像素点:
miss||=(devicereprojz–devicez)>threshold;
其中,miss表示待矫正像素点,threshold为预设的阈值,用于对重映射得到的第一场景渲染数据中的折射交界面像素点的深度值,当前帧对应的场景数据中的折射交界面的深度值之间差值进行判定。
如果devicereprojz与devicez之间的差值大于预设的阈值,也就是基于重映射的场景数据得到的深度值,远远比当前帧的场景数据中的深度值近,说明这个像素在上一帧应该是被撤档的,则需要去除这部分待矫正像素点。如图21所示,为去除水面下的重影区域21a后的示意图。但这种方式去除重影后,可能会造成动态物体的下半身区域22a出现残缺,如图22所示。
(3)对于这种情况,终端则可以进一步填补动态物件的残缺。具体可以通过如下表达式进行判定动态物体的残缺的像素点:
miss||=devicereprojz<devicez;
其中,当devicereprojz小于devicez时,表示基于重映射的第一场景渲染数据得到的深度值,比当前帧的场景数据中的深度值远,说明这部分像素产生了缺失,则需要利用当前帧中对应像素点的场景数据进行填补。如图23所示,为对场景中动态物体的像素进行填补后的示意图。但采用这种方式填补动态物件后,如图24所示,这个物体在静止时的扭曲效果可能会变弱,也就是水下的轮廓不会发生扭曲。
(4)为了改善轮廓扭曲的效果,终端可以对步骤(2)进行修改,加入一个判断条件,使得物体轮廓扭曲的像素不判定为待矫正像素。具体可以通过如下表达式进行判定:
miss||=(devicereprojz–devicez)>threshold
&&abs(devicelastz-devicereprojz)>threshold;
其中,devicelastz表示基于采样坐标偏移量,从历史场景渲染数据中采样与特定效果区域相匹配的历史场景渲染数据的深度值,即第二场景渲染数据的深度值。devicereprojz则为第一场景渲染数据的深度值。threshold与预设的阈值。
第一深度值与第二深度值之间的第一深度差值大于预设阈值,表示第一场景渲染数据中的深度值远远比当前帧的场景数据中的深度值近,表示这部分像素出现了重影。第二场景渲染数据的深度值与第一场景渲染数据的深度值之间的第二深度差值不够大则为轮廓的扭曲。终端则将同时满足这两个条件的这部分像素点,判定为待矫正像素点。如图25所示,为采用传统方式渲染得到的扭曲效果。如图26所示,为本实施例中的方式渲染得到的渲染效果。
进一步地,如图27所示,为一个实施例中水面中高速运动的物体渲染后的示意图。当带动画的物体高速运动并且帧数较低时,在水面下会出现闪现的小范围的残影。由此即使在物体高速运动并且帧数较低时,也能够渲染精准度较高的整体渲染效果。
本申请还提供一种应用场景,该应用场景为三维游戏场景,该游戏场景应用上述的场景渲染方法。具体地,终端中可以运行三维游戏应用,三维游戏应用在运行时,终端则渲染三维游戏场景中连续的图像帧。其中,三维游戏场景可以为三维虚拟场景,其中可以包括不透明物体、半透明物体以及特定效果区域等场景。特定效果区域为目标不透明物体对应的区域,目标不透明物体是当前帧中的半透明特定效果物体所覆盖的不透明物体。例如游戏场景的特定效果,可以包括水面反射、水面折射、下雨、玻璃、软粒子、贴花等中的至少一种。
具体地,当待渲染的当前帧的三维游戏场景中包括特定效果区域时,则获取与上一帧对应的单渲染通道中的不透明物体的历史场景渲染数据,通过确定特定效果区域在历史场景渲染数据中相匹配的历史场景渲染数据,能够精准地采样得到特定效果区域在上一帧中相匹配的历史场景渲染数据。
通过在一个渲染通道中渲染场景中的不透明物体、特定效果区域以及半透明物体,由此能够高效地实现在同一渲染通道中渲染场景中的所有物体,从而能够有效得到渲染精准度较高的整体场景渲染数据,并将整体场景渲染数据以及整体场景渲染数据中的不透明物体的场景渲染数据,写入与当前帧对应的单渲染通道绑定的渲染缓冲区中,进而能够高效精准地渲染出具有特定效果的图像帧。同时有效减少了渲染过程中的带宽压力,从而有效降低了游戏运行以及画面渲染过程中的资源消耗,还能够有效提高三维游戏应用的运行效率。
本申请还提供一种应用场景,该应用场景为三维环境演示场景,例如旅游环境演示场景、建筑物演示场景等,该三维环境演示场景应用上述场景渲染方法。可以通过终端或具有图像渲染功能的演示屏幕等设备,对三维环境演示场景进行渲染处理。
具体地,终端中可以将三维演示场景预先加载至本地,然后在进行渲染处理,也可以从服务器实时获取并进行渲染处理。三维环境演示场景中可以包括预设了帧序列的连续的图像帧,也可以通过控制三维环境演示场景中的虚拟视角,渲染任意场景的图像帧。其中,三维环境演示场景中也可以包括不透明物体、半透明物体以及特定效果区域等场景。特定效果区域为目标不透明物体对应的区域,目标不透明物体是当前帧中的半透明特定效果物体所覆盖的不透明物体。例如游戏场景中的特定效果,可以包括水面反射、水面折射、下雨、玻璃、软粒子、贴花等中的至少一种。
具体地,当待渲染的当前帧的三维环境演示场景中包括特定效果区域时,则获取上一帧中不透明物体的历史场景渲染数据,通过确定特定效果区域在历史场景渲染数据中相匹配的历史场景渲染数据,能够精准地采样得到特定效果区域在上一帧中相匹配的历史场景渲染数据。
通过在一个渲染通道中渲染场景中的不透明物体、特定效果区域以及半透明物体,由此能够高效地实现在同一渲染通道中渲染场景中的所有物体,从而能够有效得到渲染精准度较高的整体场景渲染数据,并将整体场景渲染数据以及整体场景渲染数据中的不透明物体的场景渲染数据,写入与当前帧对应的单渲染通道绑定的渲染缓冲区中,进而能够高效精准地渲染出具有特定效果的图像帧。由此能够有效保证三维环境演示场景的渲染精准度的同时,有效减少了渲染过程中的带宽压力,从而有效降低了渲染过程中的资源消耗。
应该理解的是,虽然图2、17流程图中的各个步骤按照箭头的指示依次显示,但是这些步骤并不是必然按照箭头指示的顺序依次执行。除非本文中有明确的说明,这些步骤的执行并没有严格的顺序限制,这些步骤可以以其它的顺序执行。而且,图2、17中的至少一部分步骤可以包括多个步骤或者多个阶段,这些步骤或者阶段并不必然是在同一时刻执行完成,而是可以在不同的时刻执行,这些步骤或者阶段的执行顺序也不必然是依次进行,而是可以与其它步骤或者其它步骤中的步骤或者阶段的至少一部分轮流或者交替地执行。
在一个实施例中,如图28所示,提供了一种场景渲染装置2800,该装置可以采用软件模块或硬件模块,或者是二者的结合成为计算机设备的一部分,该装置具体包括:数据获取模块2802和场景渲染模块2804,其中:
数据获取模块2802,用于当待渲染的当前帧的场景中包括特定效果区域时,特定效果区域为目标不透明物体对应的区域,目标不透明物体,是当前帧中的半透明特定效果物体所覆盖的不透明物体,则获取与上一帧对应的单渲染通道中的不透明物体的历史场景渲染数据;确定特定效果区域在历史场景渲染数据中相匹配的历史场景渲染数据。
场景渲染模块2804,用于基于当前帧对应的整体场景数据和相匹配的历史场景渲染数据,在与当前帧对应的单渲染通道中,渲染当前帧的场景中不透明物体、特定效果区域以及半透明物体。
在一个实施例中,数据获取模块2802还用于确定特定效果区域在上一帧中所对应的采样位置;根据采样位置对历史场景渲染数据进行采样处理,得到特定效果区域在历史场景渲染数据中相匹配的历史场景渲染数据。
在一个实施例中,数据获取模块2802还用于根据当前帧对应的投影矩阵,确定特定效果区域对应的三维场景位置;根据三维场景位置和上一帧对应的投影矩阵进行位置变换,得到重映射后的特定效果区域在上一帧中所对应的采样坐标。
在一个实施例中,数据获取模块2802还用于当特定效果区域包括反射效果区域时,根据当前帧对应的投影矩阵,确定当前帧中的相机视角和反射效果区域的反射位置;根据当前帧中的相机视角和反射效果区域的反射位置,确定对称反射射线;根据对称反射射线,确定反射效果区域对应的三维场景位置。
在一个实施例中,数据获取模块2802还用于当特定效果区域包括折射效果区域时,根据当前帧中的相机视角和折射效果区域对应的法线方向,确定采样坐标偏移量;根据采样坐标偏移量,确定折射效果区域在上一帧中所对应的采样位置。
在一个实施例中,数据获取模块2802还用于获取与上一帧对应的单渲染通道绑定的渲染缓冲区中的不透明物体的历史场景渲染数据;上述场景渲染装置还包括数据缓存模块,用于将渲染当前帧后得到的整体场景渲染数据、以及整体场景渲染数据中的不透明物体的场景渲染数据,写入与当前帧对应的单渲染通道绑定的渲染缓冲区中。
在一个实施例中,渲染缓冲区包括整体场景缓冲区和不透明物体缓冲区;数据获取模块2802还用于从上一帧对应的单渲染通道所绑定的不透明物体缓冲区中,获取上一帧中不透明物体的历史场景渲染数据;数据缓存模块2706还用于将渲染当前帧后得到的整体场景渲染数据,缓存至与当前帧的单渲染通道绑定的整体场景缓冲区中;将整体场景渲染数据中的不透明物体的场景渲染数据,缓存至与当前帧的单渲染通道绑定的不透明物体缓冲区中。
在一个实施例中,场景渲染模块2804还用于基于当前帧对应的整体场景数据,在与当前帧对应的单渲染通道中渲染当前帧的场景中的不透明物体;基于相匹配的历史场景渲染数据,在单渲染通道中渲染当前帧的场景中的特定效果区域;基于整体场景数据,在单渲染通道中渲染当前帧的场景中的半透明物体,得到当前帧对应的整体场景渲染数据。
在一个实施例中,数据获取模块2802还用于当特定效果区域包括水面效果区域时,根据预设水面高度确定与水面效果区域相匹配的预设场景数据;场景渲染模块2804还用于在渲染水面效果区域时,基于相匹配的历史场景渲染数据和预设场景数据,在单渲染通道中渲染当前帧的场景中的水面效果区域。
在一个实施例中,相匹配的历史场景渲染数据为基于重映射后的采样坐标所采样的第一场景渲染数据;数据获取模块2802还用于若当前帧对应的单渲染通道中包括子渲染通道时,通过子渲染通道获取特定效果区域对应的当前帧的场景数据;将当前帧的场景数据缓存至渲染缓冲区中;场景渲染模块2804还用于在渲染特定效果区域时,根据特定效果区域对应的当前帧中的场景数据和第一场景渲染数据,确定特定效果区域对应的目标场景数据;基于目标场景数据,在单渲染通道中渲染当前帧的场景中的特定效果区域。
在一个实施例中,场景渲染模块2804还用于当特定效果区域包括折射效果区域时,确定第一场景渲染数据对应的待矫正像素点;根据特定效果区域对应的当前帧的场景数据中的与待矫正像素点对应的场景数据,替换待矫正像素点在第一场景渲染数据中对应的场景数据,得到特定效果区域的目标场景数据。
在一个实施例中,场景渲染模块2804还用于确定第一深度值与第二深度值之间的第一深度差值;基于采样坐标偏移量,从历史场景渲染数据中采样与特定效果区域相匹配的第二场景渲染数据;确定同一像素点在第一场景渲染数据和第二场景渲染数据中的第二深度差值;当第一深度差值大于或等于第一阈值、且第二深度差值大于或等于第二阈值时,判定像素点为待矫正像素点。
关于场景渲染装置的具体限定可以参见上文中对于场景渲染方法的限定,在此不再赘述。上述场景渲染装置中的各个模块可全部或部分通过软件、硬件及其组合来实现。上述各模块可以硬件形式内嵌于或独立于计算机设备中的处理器中,也可以以软件形式存储于计算机设备中的存储器中,以便于处理器调用执行以上各个模块对应的操作。
在一个实施例中,提供了一种计算机设备,该计算机设备可以是终端,其内部结构图可以如图29所示。该计算机设备包括通过系统总线连接的处理器、存储器、通信接口、显示屏和输入装置。其中,该计算机设备的处理器用于提供计算和控制能力。该计算机设备的存储器包括非易失性存储介质、内存储器。该非易失性存储介质存储有操作系统和计算机程序。该内存储器为非易失性存储介质中的操作系统和计算机程序的运行提供环境。该计算机设备的通信接口用于与外部的终端进行有线或无线方式的通信,无线方式可通过wifi、运营商网络、nfc(近场通信)或其他技术实现。该计算机程序被处理器执行时以实现一种场景渲染方法。该计算机设备的显示屏可以是液晶显示屏或者电子墨水显示屏,该计算机设备的输入装置可以是显示屏上覆盖的触摸层,也可以是计算机设备外壳上设置的按键、轨迹球或触控板,还可以是外接的键盘、触控板或鼠标等。
本领域技术人员可以理解,图29中示出的结构,仅仅是与本申请方案相关的部分结构的框图,并不构成对本申请方案所应用于其上的计算机设备的限定,具体的计算机设备可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。
在一个实施例中,还提供了一种计算机设备,包括存储器和处理器,存储器中存储有计算机程序,该处理器执行计算机程序时实现上述各方法实施例中的步骤。
在一个实施例中,提供了一种计算机可读存储介质,存储有计算机程序,该计算机程序被处理器执行时实现上述各方法实施例中的步骤。
在一个实施例中,提供了一种计算机程序产品或计算机程序,该计算机程序产品或计算机程序包括计算机指令,该计算机指令存储在计算机可读存储介质中。计算机设备的处理器从计算机可读存储介质读取该计算机指令,处理器执行该计算机指令,使得该计算机设备执行上述各方法实施例中的步骤。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储于一非易失性计算机可读取存储介质中,该计算机程序在执行时,可包括如上述各方法的实施例的流程。其中,本申请所提供的各实施例中所使用的对存储器、存储、数据库或其它介质的任何引用,均可包括非易失性和易失性存储器中的至少一种。非易失性存储器可包括只读存储器(read-onlymemory,rom)、磁带、软盘、闪存或光存储器等。易失性存储器可包括随机存取存储器(randomaccessmemory,ram)或外部高速缓冲存储器。作为说明而非局限,ram可以是多种形式,比如静态随机存取存储器(staticrandomaccessmemory,sram)或动态随机存取存储器(dynamicrandomaccessmemory,dram)等。
以上实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。
以上所述实施例仅表达了本申请的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本申请构思的前提下,还可以做出若干变形和改进,这些都属于本申请的保护范围。因此,本申请专利的保护范围应以所附权利要求为准。