基于unity实现的半兰伯特光照模型

2020-07-04 02:14彭人杰段华琼
电脑知识与技术 2020年14期
关键词:计算机图形学

彭人杰 段华琼

摘要:该文介绍了计算机图形学中基本的光照效果,讲解了基本的兰伯特光照模型与其改进方案半兰伯特光照模型。给出了实际运用在uniIy游戏开发中的场景光照解决方案。

关键词:unity;计算机图形学;光照模型

中图分类号:TP393 文献标识码:A

文章编号:1009-3044(2020)14-01 12-02

游戏是计算机等电子产品设备普及以来产生的一种娱乐方式,随着硬件技术的进步,人们对游戏体验的要求也越来越高,对游戏的画面要求也大大提升。一款游戏的画面质量,很大程度上取决于其贴图纹理和场景光照的效果。本文通过介绍基本的光照模型,并运用到实际开发流程中所要做出的改进模型,以此实现提升玩家游玩体验的光照效果。

1基本的兰伯特光照模型

兰伯特光照模型,于1760年由JohannHeinrich Lambea提出的,在其著作Photometria中,兰伯特光照模型定义了一个理想的无光泽表面或漫反射表面,无论观察视角如何改变,这个表面的亮度永远不变。也就是说,该光照模型是符合各向同性的。这个模型是由表面法线向量和光线向量所决定的。计算二者夹角的余弦值得到物体表面反射光线的强度。公式如下:

该光照模型以表面法线和光源方向做向量点乘运算,但是,这两个向量的夹角有可能为钝角,比如,光线照不到的地方,那么该点乘运算结果则是负值,这样的结果就会造成不符合现实的场景出现在我们的游戏中,比如物体会被后面射来的光照亮,破坏了游戏场景的逼真度。为此,我们对向量点乘的运算结果进行一个截取,使其计算结果为非负值。如代码中的max函数,取0和点乘结果的最大值,若点乘为负,值取0。图1为着色器代码在uniIv引擎中运行的结果。

2改进后的半兰伯特光照模型

将上述的兰伯特定律在unity中以shader文件进行实现后,我们就得到了一个简单的基于兰伯特定律的漫反射光照模型,如图2所示。但是,在这些模型的背面,是完全黑的,没有任何的明暗变化,这就导致了该光照模型在光照无法到达的区域看起来宛如一个平面一样,模型没有任何细节,游戏画面显得突兀,死板。这种光照要是运用到游戏中,会大幅度消减玩家的游玩体验。

对于上述的画面问题,人们提出了一些解决方案,例如间接光照。在现实生活中,即使有物体没有被光源直接照射,人的肉眼还是可以看见它。这就是因为光的反射造成的间接光照。在现在的计算机图形学中,可以通过环境光系数来统一代表间接光,或者是采用更加复杂,对硬件要求更高,画面更加写实的光线追踪技术来渲染间接光。

但在某些情况下,比如在早期的游戏制作中,当时的计算机技术远远没有现在的成熟,没有条件实现间接光照。就催生出一种基于兰伯特定理的改进模型,即半兰伯特光照模型,该模型既保证了兰伯特模型计算出来的光照结果大于0,又整体提升了亮度,使非直接受光面不是单纯的置为黑色。这里运用了一个在图形学领域经常有的变换,区间转化——将另一个区间上的问题,转化为已知公式的区间上去,并借助已知的公式或函数性质,使问题得到解决。在建立兰伯特模型的时候,我们就将值范围从(-1,1)化为(0,1)防止物体的背光面被从后面射来的光线照亮。那么兰伯特光照模型的视觉改进型——半兰伯特光照模型,也是如此。它的本质就是一个区间转化,将值范围缩小,使其背光面不要太黑。

半兰伯特光照模型的公式如下:

将半兰伯特应用于unity中,我们就得到了图3,可以看到,此时的背光面视角已经改善了不少。虽然这种视觉加强技术并不一定符合现实物理规律,但它可以被应用于不少的实际开发中,市场上不少二次元风格的手游会应用到这种节约资源的视觉光照技术。

3基于unity实现半兰伯特光照的过程

3.1编程接口

我们这里采用unity shader这个unity内置的编程接口来实现我们所需要的光照模型,shader,意为着色器。着色器是一种渲染图形的一门技术,也是渲染流水线的一个环节。

3.2渲染流水线基础

渲染流水线也称为渲染管线,是显示芯片内部处理图像信号相互独立的并行处理单元。它将储存在计算机内部的图像数据转化为肉眼可见的图形,渲染流水线的工作原理与生活中的生产流水线相符,其效率都是由最耗费时间的环节决定。一般情况下有三个阶段:应用阶段,几何阶段和光栅化阶段。应用阶段的任务是输出渲染图元(即完成渲染工作所需要的几何信息);几何阶段将应用阶段得到的图形顶点坐标从模型空间转换为屏幕空间,再将数据传递给光栅化阶段;光栅化阶段决定了各个像素的绘制位置等。

3.3 CPU与渲染流水线

渲染流水线中的每一步输入信息都是由上一步处理后得到的,而渲染流水线的输人则是由CPU完成的。通过CPU将数据从硬盘加载到系统内存中,之后从内存加载到显存。CPU还会将一个命令发送给GPU并指令GPU通过顶点数据和渲染状态完成各个网格的渲染工作,输出最终像素。这个命令是由CPU调用图形编程接口完成的(也称为DrawCall)。

3.4 GPU处理渲染流水线

GPU以流水线的形式高效地完成了渲染工作,如图4。

其中,顶点着色器,曲面细分着色器,几何着色器和片元着色器是可以由开发者编程控制的(除了顶点着色器,其余都是可选的)。顶点着色器主要实现顶点的空间变换和逐顶点光照,所有的顶点都要调用一次顶点着色器,该着色器最重要的一个功能是,将顶点从模型空间变换至齐次裁剪空间中,方便后续的计算。曲面细分着色器和几何着色器分别负责细分图元和图元着色工作。片元着色器(DirectX中被称为“像素着色器”)将得到的位于齐次裁剪坐标下的顶点数据进行计算,计算出每个像素的最终颜色和深度以及丢弃无需的片元。该着色器可以多次访问纹理内存,并以任意方式结合所读取的值。在这次对于半兰伯特光照的实现中,我们就要重点完成顶点着色器和片元着色器的代码编写。

3.5利用unity的ShaderLab实现着色器编程

Unity中的所有着色器文件都是使用名为ShaderLab的声明性语言来编写。在文件中,嵌套大括号语法声明了描述着色器的各种内容,比如使用哪種混合模式,是否使用前向光照,在材质面板显示哪些属性等等。这种语言并不只是着色器代码,而是包含了一个游戏对象的材质所需包含的全部信息。

Unity引擎会根据运行的平台来把我们编写的uniIv shader编译成真正的代码和着色器文件。我们仅需要完成ShaderLab的编程设计。

3.6 CG代码实现

Unity shader我们采用ShaderLab编写,而里面的顶点着色器和片元着色器,则使用CG,HLSL,GLSL这类着色语言编写,因为CG和HLSL十分类似,所以在unity里,CG和HLSL是等价的,实现代码如下:

4结束语

本文论述了以unitv引擎为基础实现的半兰伯特光照模型,通过借助对基本的兰伯特定律推断出来的漫反射光照模型进行区间转化,将值范围修改至符合人体视觉感受的光照效果范围,并且GPu无需太大的消耗。该光照实现方案可运用于Cel-shading、Toon-Shading和渐变纹理中。

猜你喜欢
计算机图形学
用面向科学思维的教学方法改进计算机图形学课程教学
论数字媒体艺术教育中专业方向细分的必要性
基于计算思维的计算机图形学教学改革与实践
计算机图形学教学改革浅论