【起源粉进阶修炼】起源引擎的漫反射光照 您所在的位置:网站首页 起源引擎游戏深度怎么调 【起源粉进阶修炼】起源引擎的漫反射光照

【起源粉进阶修炼】起源引擎的漫反射光照

2024-05-16 23:04| 来源: 网络整理| 查看: 265

在上一篇文章中,

 我们提到了这个神秘的玩意儿:

其实这是为了方便普通玩家理解而作出的超级简化版表达式,严格来讲其实是错误的,写成程序跑不起来。实际上起源的漫反射光照方程复杂程度远比这个高。

现在,穿好你的工作服,准备进入 C 区 黑山基地图形学研究设施。

我们要怎么样得到出射光呢?

看:

根据最基本的 光源 - 表面 - 摄像机,我们能得到三条有向线段。

黑色:入射光,也是光源位置,  ,我们也设定一个标量  来表示光源发散的光

红色:法线,

绿色:出射光,数值为  

反射出去的光强根据光源方向和表面夹角的余弦值而定,我们能得到这样一个很简单的方程:

这个就是经典的 Lambert 漫反射模型了,它是一种理想的物理方程。

在引擎里,我们对法线和光源的向量进行归一化操作,也就是它们的长度都为 1 :

看,这时候我们求解余弦值就只需要对法线和光源的向量做点乘就可以了,于是:

这就回到了我们上篇文章提到的方程了,长得一模一样。

我们也知道,现实中完全不会出现如此理想化的情况。就像没有真正完全光滑的平面一样。所以就算是遵循了一般情况下光沿直线传播的规律,我们也不能叫它基于物理的渲染。(这也是使用 PBR 的起源 2 存在的意义之一)

不过我们只定义了光的数值,这远远不够。

我们知道游戏里到处都是纹理贴图,对计算机来说就是一大堆的 RGB 颜色数值,这时候我们就需要用颜色数值乘光强( )来进行着色操作了。

我们定义表面的颜色 (英文是 Albedo 或 Diffuse Color,有很多种叫法)   ,这时候我们得到这样单个 光源-平面-摄像机 的着色方程:

就是 Lambert 漫反射光照。

我们还知道,游戏里不只有 1 个光源,所以我们把这个方程推广到任意光源数量的形式。

 其中光源数量  

我们先来看下一个光源,也就是  的效果:

感觉这光效还行,呲,但是感觉这颜色变化得太快了。你看,从亮面到黑色部分没有什么过渡。这怎么办呢?

V 社想出了一个好办法。来我们回到这个方程上面来:

我们之前谈到, 就是 

这里有个小插曲,这个余弦波瓣是不允许负值存在的。因为这就是一个衰减系数,通过  内的比值来调节亮度。所以整个余弦函数的值域通过 clamping 落在区间内。 

回到正题,我们把  项拿出来之后,我们观察一下它的图像,一个标准的余弦函数图像:

怎么样让它变化得舒缓一些呢? 

高中必修一(新教材)数学告诉我们  的各种变换性质,其中 为放缩因子,我们就对它做文章。我们分别来看看  (蓝色)和  (绿色)时的图像:

显然, 时,图像的变化和原来相比就变得舒缓了很多。

不过这样一来最大值就只有  了。好办,我们再加一个  不就落在  了:

额,但是你看啊,这尾巴未免有点太离谱了吧。。别人的光照早就衰减到 0 了,你这还有这么多,过于脱离真实了。那怎么办呢?

我们对  求导:

时,原函数和原来一样,导函数为  ,如图:

紫色图像为导函数

不难发现,这紫色图像本身的数值变化就不大,原函数也就拖着这么长的尾巴了。

不过,如果  值增大会这么样呢?例如 ,导函数稍微变陡了点。原函数的图像明显被 “压” 下去了:

所以对  平方,终于得到了一个比较令人满意的结果:

Now these points of data make a beautiful line,

and we're out of beta We're releasing on time !

这时候,变化率不但比传统余弦波瓣更舒缓了,也能在可接受的范围内进行光照补偿了。

接下来我们调整后的的余弦项就得到了:

所以:

我们之前得到的原版漫反射光照方程:

经刚才调整后:

来看看实际效果。左边是原方程,右边是调整后的方程:

是不是明显光照过渡得舒缓很多了,并且也没有大片大片黑不拉几的部分,这大大提高了玩家的游玩体验,这就是起源引擎的漫反射光照模型的作用了。

刚刚我们的那一大堆对余弦项的调整其实就是 V 社的研究人员想出来的,因为存在  的放缩关系,所以 V 社将这个光照方程命名为 “Half-Lambert” 模型。

不过本人更倾向于 Half 是取自 Half-Life 的说法(

不过还有一件事,我们这里算的东西只是直接光照,都是和光源直接相关的。要构成漫反射全局光照,我们还需要来自环境光(Ambient)的信息:

你看这个起源引擎的着色树结构,是不是还有一个 Ambient Cube 的环境光项,说明这事儿还没完。其实我们只需要在光照模型里加入环境光项就可以了:

其中  是环境光颜色,对 Ambient Cube 进行采样可以得到,而  就是环境光强度了,也和  一样需要用法线  做点乘。

本文至此就告一段落了。我们讲述了 V 社在起源引擎上做光照用了什么样的数学方法和技巧,希望对你有帮助,这方面的资料实在是太少并且水平低下(日常迫害 VDC),我想尽力把像素背后的故事传递给起源圈的各位。

这同时是 V 社和数学,计算机科学与美学所演绎的最纯粹的艺术!



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有