【起源粉進階修煉】起源引擎的漫反射光照

在上一篇文章中,

?我們提到了這個神秘的玩意兒:

其實這是為了方便普通玩家理解而作出的超級簡化版表達式,嚴格來講其實是錯誤的,寫成程序跑不起來。實際上起源的漫反射光照方程復(fù)雜程度遠比這個高。
現(xiàn)在,穿好你的工作服,準備進入 C?區(qū) 黑山基地圖形學(xué)研究設(shè)施。

我們要怎么樣得到出射光呢?
看:

根據(jù)最基本的 光源 - 表面 - 攝像機,我們能得到三條有向線段。
黑色:入射光,也是光源位置, ?,我們也設(shè)定一個標量?
?來表示光源發(fā)散的光
紅色:法線,
綠色:出射光,數(shù)值為??
反射出去的光強根據(jù)光源方向和表面夾角的余弦值而定,我們能得到這樣一個很簡單的方程:
這個就是經(jīng)典的 Lambert 漫反射模型了,它是一種理想的物理方程。
在引擎里,我們對法線和光源的向量進行歸一化操作,也就是它們的長度都為 1 :
看,這時候我們求解余弦值就只需要對法線和光源的向量做點乘就可以了,于是:
這就回到了我們上篇文章提到的方程了,長得一模一樣。
我們也知道,現(xiàn)實中完全不會出現(xiàn)如此理想化的情況。就像沒有真正完全光滑的平面一樣。所以就算是遵循了一般情況下光沿直線傳播的規(guī)律,我們也不能叫它基于物理的渲染。(這也是使用 PBR 的起源 2 存在的意義之一)
不過我們只定義了光的數(shù)值,這遠遠不夠。
我們知道游戲里到處都是紋理貼圖,對計算機來說就是一大堆的 RGB 顏色數(shù)值,這時候我們就需要用顏色數(shù)值乘光強(?)來進行著色操作了。
我們定義表面的顏色 (英文是 Albedo 或 Diffuse Color,有很多種叫法) ??,這時候我們得到這樣單個?光源-平面-攝像機?的著色方程:
就是 Lambert 漫反射光照。
我們還知道,游戲里不只有 1 個光源,所以我們把這個方程推廣到任意光源數(shù)量的形式。
?其中光源數(shù)量??
我們先來看下一個光源,也就是? 的效果:

感覺這光效還行,呲,但是感覺這顏色變化得太快了。你看,從亮面到黑色部分沒有什么過渡。這怎么辦呢?
V 社想出了一個好辦法。來我們回到這個方程上面來:
我們之前談到, 就是?
這里有個小插曲,這個余弦波瓣是不允許負值存在的。因為這就是一個衰減系數(shù),通過??內(nèi)的比值來調(diào)節(jié)亮度。所以整個余弦函數(shù)的值域通過 clamping 落在
區(qū)間內(nèi)。?
回到正題,我們把??項拿出來之后,我們觀察一下它的圖像,一個標準的余弦函數(shù)圖像:

怎么樣讓它變化得舒緩一些呢??
高中必修一(新教材)數(shù)學(xué)告訴我們??的各種變換性質(zhì),其中
為放縮因子,我們就對它做文章。我們分別來看看?
?(藍色)和?
(綠色)時的圖像:

顯然, 時,圖像的變化和原來相比就變得舒緩了很多。
不過這樣一來最大值就只有? 了。好辦,我們再加一個?
不就落在?
?了:

額,但是你看啊,這尾巴未免有點太離譜了吧。。別人的光照早就衰減到 0 了,你這還有這么多,過于脫離真實了。那怎么辦呢?
我們對? 求導(dǎo):
時,原函數(shù)和原來一樣,導(dǎo)函數(shù)為?
?,如圖:

不難發(fā)現(xiàn),這紫色圖像本身的數(shù)值變化就不大,原函數(shù)也就拖著這么長的尾巴了。
不過,如果? 值增大會這么樣呢?例如?
,導(dǎo)函數(shù)稍微變陡了點。原函數(shù)的圖像明顯被 “壓” 下去了:

所以對??平方,終于得到了一個比較令人滿意的結(jié)果:

這時候,變化率不但比傳統(tǒng)余弦波瓣更舒緩了,也能在可接受的范圍內(nèi)進行光照補償了。
接下來我們調(diào)整后的的余弦項就得到了:
所以:
我們之前得到的原版漫反射光照方程:
經(jīng)剛才調(diào)整后:
來看看實際效果。左邊是原方程,右邊是調(diào)整后的方程:

是不是明顯光照過渡得舒緩很多了,并且也沒有大片大片黑不拉幾的部分,這大大提高了玩家的游玩體驗,這就是起源引擎的漫反射光照模型的作用了。
剛剛我們的那一大堆對余弦項的調(diào)整其實就是 V 社的研究人員想出來的,因為存在??的放縮關(guān)系,所以 V 社將這個光照方程命名為 “Half-Lambert” 模型。
不過本人更傾向于 Half 是取自 Half-Life 的說法(
不過還有一件事,我們這里算的東西只是直接光照,都是和光源直接相關(guān)的。要構(gòu)成漫反射全局光照,我們還需要來自環(huán)境光(Ambient)的信息:

你看這個起源引擎的著色樹結(jié)構(gòu),是不是還有一個 Ambient Cube 的環(huán)境光項,說明這事兒還沒完。其實我們只需要在光照模型里加入環(huán)境光項就可以了:
其中? 是環(huán)境光顏色,對?Ambient Cube 進行采樣可以得到,而?
就是環(huán)境光強度了,也和?
一樣需要用法線?
做點乘。
本文至此就告一段落了。我們講述了 V 社在起源引擎上做光照用了什么樣的數(shù)學(xué)方法和技巧,希望對你有幫助,這方面的資料實在是太少并且水平低下(日常迫害 VDC),我想盡力把像素背后的故事傳遞給起源圈的各位。

這同時是 V 社和數(shù)學(xué),計算機科學(xué)與美學(xué)所演繹的最純粹的藝術(shù)!