一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种光照颜色显示方法、装置、电子设备及存储介质

2022-07-10 05:59:28 来源:中国专利 TAG:


1.本发明涉及光照渲染技术领域,特别是涉及一种光照颜色显示方法、装置、电子设备及存储介质。


背景技术:

2.构建游戏场景的过程中,通常需要布置各种光源。不同的光源之间也有较大的区别。点光源与其他光源最主要的区别在于,点光源只会对以这个灯光为光源点向各个方向散发光线,而且它的的光照强度会随着沿着该点光源所在的位置发出的光线越来越弱。
3.游戏场景中的光照设置会直接影响游戏场景整体的渲染效果,比如当遇到像舞台这样的特殊场景时,则会需要大量的点光源。但是在同一场景中存在当一个物体周围放置了多个点光源的时候,该物体在固定范围内只接受和它距离最近的光源对它的影响,使得最终的环境无法到达想要的效果。
4.unity通用渲染管线(universal render pipeline,urp)中的默认材质着色器只会计算最近的点光源的影响,也就是说物体受距离最近的点光源的影响最大。这就导致我们可以很明显的看到两个点光源交界处,在物体上显示的该光源过渡仅仅只呈现距离该物体最近的那个光源的一种颜色。光源交叉处的并不存在颜色过渡,交叉区域只会呈现离该物体最近的一种颜色。这使得最终呈现光源颜色是突然的过渡,这样得到的效果很突兀。


技术实现要素:

5.基于此,本发明的目的在于,提供一种光照颜色显示方法、装置、电子设备及存储介质,可以令点光源交汇处的过渡颜色不再只为单调的一种颜色,而是融合了交叉处多种光源的混合颜色。
6.第一方面,本发明提供一种光照颜色显示方法,包括以下步骤:
7.获取画面中所有点光源的坐标和颜色;
8.针对每一个待显示光照颜色的像素点,根据所述点光源的坐标,计算所述像素点对应的每个点光源的衰减值;
9.根据所有点光源的坐标和颜色,计算每个像素点对应的每个点光源的单位光向量;
10.根据所述单位光向量,计算每个像素点对应所述每个点光源的漫反射值和镜面反射值;
11.根据所述漫反射值、所述镜面反射值和预定义环境光,计算每个像素点对应的光照颜色;
12.获取画面预设的透明度值,根据所述透明度值和所述像素点对应的光照颜色,显示所述像素点的光照颜色。
13.进一步地,根据所述单位光向量,计算每个像素点对应所述每个点光源的漫反射值,包括:
14.使用以下公式,计算漫反射值:
15.d=a*l.
xyz
*saturate(dot(n,l))
16.其中,d为所述像素点对应点光源的漫反射值,a为漫反射系数,l.xyz为射入光源的位置,n为单位法向量,l为单位光向量;dot()函数表示将单位法向量和单位光向量进行点积运算,saturate()函数表示将点积运算的值返回在0-1之间。
17.进一步地,根据所述单位光向量,计算每个像素点对应所述每个点光源的镜面反射值,包括:
18.使用以下公式,计算镜面反射值:
19.s=k*a*saturate(dot(n,l))*(pow(max(dot(reflect(-l,n),v),0))
shininess
20.其中,s为所述像素点对应点光源的镜面反射值,k为材质反射的高光颜色,a为漫反射系数,n为单位法向量,l为单位光向量;dot()函数表示将单位法向量和单位光向量进行点积运算,saturate()函数表示将点积运算的值返回在0-1之间,reflectt()函数为计算反射的函数,max()函数表示取最大值,pow()函数用来求x的y次方的值,shininess为调节光泽度的指数。
21.进一步地,根据所有点光源的坐标和颜色,计算每个像素点对应的每个点光源的单位光向量,包括:
22.使用getmainlight()函数得到主光源;
23.在additional pass中采用当前光源的位置减去片段着色器里的位置的方法,得到所述像素点与所述点光源的坐标;
24.对所述坐标进行归一化处理,得到所述像素点对应所述点光源的单位光向量。
25.进一步地,对所述坐标进行归一化处理,包括:
26.使用normalize()函数进行归一化处理,对所述点光源到所述像素点的入射光向量,使用normalize()函数进行归一化处理,得到长度为1的单位光向量。
27.进一步地,根据所述漫反射值、所述镜面反射值和预定义环境光,计算每个像素点对应的光照颜色,包括:
28.使用以下公式,计算每个像素点对应的光照颜色:
29.f=(d s _glossyenvironmentcolor m)*col.
rgb
30.其中,f为光照颜色,d为漫反射值,s为镜面反射值,col.rgb指代计算的这个点光源的颜色,_glossyenvironmentcolor是urp预定义的环境光,m是用于调整效果的变量。
31.进一步地,所述预设的透明度为1.0。
32.第二方面,本发明还提供一种光照颜色显示装置,包括:
33.点光源获取模块,用于获取画面中所有点光源的坐标和颜色;
34.衰减值计算模块,用于针对每一个待显示光照颜色的像素点,根据所述点光源的坐标,计算所述像素点对应的每个点光源的衰减值;
35.单位光向量计算模块,用于根据所有点光源的坐标和颜色,计算每个像素点对应的每个点光源的单位光向量;
36.反射值计算模块,用于根据所述单位光向量,计算每个像素点对应所述每个点光源的漫反射值和镜面反射值;
37.光照颜色计算模块,用于根据所述漫反射值、所述镜面反射值和预定义环境光,计
算每个像素点对应的光照颜色;
38.显示模块,用于获取画面预设的透明度值,根据所述透明度值和所述像素点对应的光照颜色,显示所述像素点的光照颜色。
39.第三方面,本发明还提供一种电子设备,其特征在于,包括:
40.至少一个存储器以及至少一个处理器;
41.所述存储器,用于存储一个或多个程序;
42.当所述一个或多个程序被所述至少一个处理器执行,使得所述至少一个处理器实现如本发明第一方面任一所述的一种光照颜色显示方法的步骤。
43.第四方面,本发明还提供一种计算机可读存储介质,其特征在于:
44.所述计算机可读存储介质存储有计算机程序,所述计算机程序被处理器执行时实现如本发明第一方面任一所述的一种光照颜色显示方法的步骤。
45.本发明提供的一种光照颜色显示方法、装置、电子设备及存储介质,可以令点光源交汇处的过渡颜色不再只为单调的一种颜色,而是融合了交叉处多种光源的混合颜色,将光源交叉处的多种光的颜色混合,提高了场景最终的着色效果。
46.为了更好地理解和实施,下面结合附图详细说明本发明。
附图说明
47.图1为本发明提供的一种光照颜色显示方法的流程示意图;
48.图2为本发明提供的一种光照颜色显示装置的结构示意图;
49.图3为本发明在一个实施例中显示的光照颜色效果示意图的灰度图。
具体实施方式
50.为使本技术的目的、技术方案和优点更加清楚,下面将结合附图对本技术实施例方式作进一步地详细描述。
51.应当明确,所描述的实施例仅仅是本技术实施例一部分实施例,而不是全部的实施例。基于本技术实施例中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其它实施例,都属于本技术实施例保护的范围。
52.在本技术实施例使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本技术实施例。在本技术实施例和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本文中使用的术语“和/或”是指并包含一个或多个相关联的列出项目的任何或所有可能组合。
53.下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本技术相一致的所有实施方式。相反,它们仅是如所附权利要求书中所详述的、本技术的一些方面相一致的装置和方法的例子。在本技术的描述中,需要理解的是,术语“第一”、“第二”、“第三”等仅用于区别类似的对象,而不必用于描述特定的顺序或先后次序,也不能理解为指示或暗示相对重要性。对于本领域的普通技术人员而言,可以根据具体情况理解上述术语在本技术中的具体含义。
54.此外,在本技术的描述中,除非另有说明,“多个”是指两个或两个以上。“和/或”,描述关联对象的关联关系,表示可以存在三种关系,例如,a和/或b,可以表示:单独存在a,
同时存在a和b,单独存在b这三种情况。字符“/”一般表示前后关联对象是一种“或”的关系。
55.在一个具体的实施例中,本发明提供的一种光照颜色显示方法,通过在unity构建游戏场景的过程中实现。
56.在实现本发明提供的一种光照颜色显示方法之前,首先在unity中创建舞台和点光源。包括以下步骤:
57.第一步中,先将需要用到的资源打包好,打开unity hub在项目中新建unity urp项目的模板,然后将打包好的资源通过package manager导入assets文件夹中。将材质导入其中后,肯会出现材质失效的现象,出现这种问题主要是因为urp无法对该材质之前的shader做出正确的识别。因此,需要改变其类别,只需要用upgrade project materials to universalirp materials一键替换即可。这个办法也不是所有shader都可以用的,当遇到手写的shader时就会失灵,这时就需要我们手动修改。
58.第二步中,在daz studio选择的两个figures分别是genesis 8female以及genesis 8male,并对其添加了相应的服装,然后将做好的两个人物模型用fbx export options导出。将导出的文件直接拖进assets文件夹内即可。人物模型再导入时也可能会遇到无法正确识别该材质之前的shader的情况,按照第一步的方法解决即可。
59.第三步,运用导入的物品创建所需要的舞台场景,并且在给点光源的放置留有足够空间的基础上,将两名人物角色放置在舞台中间的位置上。
60.第四步,在两名角色在脚底和头顶处添加不同颜色的4个点光源。这里采取了叠加的方式,将点光源一个一个加入场景中。将编写好的添加点光源c#文件通过add component加入,通过手动点击inspector中的add添加光源。除此之外还需要修改每个平面支持接收最大数量的点光源,由于unity urp的管线和普通的管线不一样,不像普通管线可以直接在quality中去进行数量设置,因此需要直接选中urp资源中的per object light,将支持点光源数量调整至最大数量为8个。
61.基于上述创建好的舞台和光源,针对背景技术中的问题,本技术实施例提供一种光照颜色显示方法,如图1所示,该方法包括以下步骤:
62.s01:获取画面中所有点光源的坐标和颜色。
63.在一个具体的实施例中,首先通过手动编写一个shader,采用前向渲染的方法,用两个pass来处理光源,一个base pass计算主光源,用另一个additional pass处理其他光源。其中,点光源的格式决定additional pass被调用的次数,本发明中布置了16个点光源,因此会调用16次additional pass。
64.s02:针对每一个待显示光照颜色的像素点,根据所述点光源的坐标,计算所述像素点对应的每个点光源的衰减值。
65.想要改变光源交叉处的颜色就需要修改衰减因子。而点光源的衰减是随着该点进行的,故而想要得到确定点到光源的衰减值,就必须得到该点的位置。而在unity中,urp管线只会计算在限制数量范围内的非主光源,因此本发明采用了叠加的方法,将超出部分一个一个的加进去。另一方面,因为当场景中含有方向光时,计算光源位置的函数实际计算的位置中含有方向光源,故而需要计算专门的点光源的位置。因此将添加点光源的c#文件中的光源颜色和位置传入该shader中,然后采用变换矩阵的方式将世界空间的位置转换为光源空间,这样就得到了该点的坐标值。
66.然后判断是否是平行光,如果是,则通过使用坐标模的平方将距离直接平方处理,对在此基础上对得到的值调用unity_atten_channel计算得到最终的衰减值。如果不是,则需要在上述基础上用线性的方法计算最终的衰减值。
67.s03:根据所有点光源的坐标和颜色,计算每个像素点对应的每个点光源的单位光向量。
68.计算光源方向,在base pass中直接用getmainlight()方法获取当前光源的位置来得到主光源的光源方向。在additional pass中点光源的光源方向需要随着视角方向变化,因此采用当前光源的位置减去片段着色器里的位置的方法。并对上述得到的坐标进行归一化处理。
69.优选的,对所述点光源到所述像素点的入射光向量,使用normalize()函数进行归一化处理,得到长度为1的单位光向量。
70.s04:根据所述单位光向量,计算每个像素点对应所述每个点光源的漫反射值和镜面反射值。
71.漫反射,是投射在粗糙表面上的光向各个方向反射的现象。当一束平行的入射光线射到粗糙的表面时,表面会把光线向着四面八方反射,所以入射线虽然互相平行,由于各点的法线方向不一致,造成反射光线向不同的方向无规则地反射,这种反射称之为“漫反射”或“漫射”。这种反射的光称为漫射光。
72.优选的,漫反射的计算方式为:
73.对于主光源和点光源关于漫反射的计算方法都是一样的,采用将兰伯特漫光照模型改进后的公式计算,通过如下三个变量相乘起来得到漫反射的值。
74.d=a*l.
xyz
*saturate(dot(n,l))
75.其中,d为所述像素点对应点光源的漫反射值,a为漫反射系数,l.xyz为射入光源的位置,n为单位法向量,l为单位光向量;dot()函数表示将单位法向量和单位光向量进行点积运算,saturate()函数表示将点积运算的值返回在0-1之间。
76.为了防止法向量和光向量做完点积后的值为负,因此使用saturate函数,将得到的值固定到[0,1]之间。
[0077]
镜面反射的原理即光线照射到物体后发生反射、散射等打到反射平面之后又通过镜面反射到达人眼。根据光的直线传播原则,可以推出在镜面反射点的观察结果与在虚拟观察点(观察点关于反射平面的对称位置)的渲染结果相同,这也是采样反射相机渲染结果法的原理。
[0078]
优选的,镜面反射的计算方式为:
[0079]
使用以下公式,计算镜面反射值:
[0080]
s=k*a*saturate(dot(n,l))*(pow(max(dot(reflect(-l,n),v),0))
shininess
[0081]
其中,s为所述像素点对应点光源的镜面反射值,k为材质反射的高光颜色,a为漫反射系数,n为单位法向量,l为单位光向量;dot()函数表示将单位法向量和单位光向量进行点积运算,saturate()函数表示将点积运算的值返回在0-1之间,reflectt()函数为计算反射的函数,max()函数表示取最大值,pow()函数用来求x的y次方的值,shininess为调节光泽度的指数。
[0082]
计算镜面反射值时之所以用max函数使得值不小于0,是为了避免不应该存在光照
的地方出现光照。
[0083]
s05:根据所述漫反射值、所述镜面反射值和预定义环境光,计算每个像素点对应的光照颜色。
[0084]
在一个优选的实施例中,使用以下公式,计算每个像素点对应的光照颜色:
[0085]
f=(d s _glossyenvironmentcolor m)*col.
rgb
[0086]
其中,f为光照颜色,d为漫反射值,s为镜面反射值,col.rgb指代计算的这个点光源的颜色,_glossyenvironmentcolor是urp预定义的环境光,m是用于调整效果的变量。
[0087]
s06:获取画面预设的透明度值,根据所述透明度值和所述像素点对应的光照颜色,显示所述像素点的光照颜色。
[0088]
透明度数值由人为设置,该值的目的在于使得最终呈现的光照效果更好。
[0089]
在一个优选的实施例中,透明度设置为1.0。
[0090]
如图3所示,与当前unity中对于多个点光源处理的技术相比,本发明提出了一种光照颜色显示方法,通过对着色器里面计算光照的代码进行修改,将光源交叉处的多种光的颜色混合,提高了场景最终的着色效果。
[0091]
本技术实施例还提供一种光照颜色显示装置,如图2所示,该光照颜色显示装置400包括:
[0092]
点光源获取模块401,用于获取画面中所有点光源的坐标和颜色;
[0093]
衰减值计算模块402,用于针对每一个待显示光照颜色的像素点,根据所述点光源的坐标,计算所述像素点对应的每个点光源的衰减值;
[0094]
单位光向量计算模块403,用于根据所有点光源的坐标和颜色,计算每个像素点对应的每个点光源的单位光向量;
[0095]
反射值计算模块404,用于根据所述单位光向量,计算每个像素点对应所述每个点光源的漫反射值和镜面反射值;
[0096]
光照颜色计算模块405,用于根据所述漫反射值、所述镜面反射值和预定义环境光,计算每个像素点对应的光照颜色;
[0097]
显示模块406,用于获取画面预设的透明度值,根据所述透明度值和所述像素点对应的光照颜色,显示所述像素点的光照颜色。
[0098]
优选的,反射值计算模块包括:
[0099]
漫反射值计算单元,用于使用以下公式,计算漫反射值:
[0100]
d=a*l.
xyz
*saturate(dot(n,l))
[0101]
其中,d为所述像素点对应点光源的漫反射值,a为漫反射系数,l.xyz为射入光源的位置,n为单位法向量,l为单位光向量;dot()函数表示将单位法向量和单位光向量进行点积运算,saturate()函数表示将点积运算的值返回在0-1之间。
[0102]
优选的,反射值计算模块还包括:
[0103]
镜面反射值计算单元,用于使用以下公式,计算镜面反射值:
[0104]
s=k*a*saturate(dot(n,l))*(pow(max(dot(reflect(-l,n),v),0))
shininess
[0105]
其中,s为所述像素点对应点光源的镜面反射值,k为材质反射的高光颜色,a为漫反射系数,n为单位法向量,l为单位光向量;dot()函数表示将单位法向量和单位光向量进行点积运算,saturate()函数表示将点积运算的值返回在0-1之间,reflectt()函数为计
o m)、电可擦除可编程只读存储器(eeprom)、快闪记忆体或其他内存技术、只读光盘只读存储器(cd-rom)、数字多功能光盘(dvd)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。
[0124]
本发明提供的一种光照颜色显示方法、装置、电子设备及存储介质,可以令点光源交汇处的过渡颜色不再只为单调的一种颜色,而是融合了交叉处多种光源的混合颜色,将光源交叉处的多种光的颜色混合,提高了场景最终的着色效果。
[0125]
以上所述实施例仅表达了本发明的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变形和改进,这些都属于本发明的保护范围。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献