Physically Based Rendering 光照

背景

最近在從頭開始寫一個引擎, 涉及到渲染部分, 就會寫 PBR(Physically Based Rendering) 相關(guān)的代碼. 這里特地記錄一下個人理解對相關(guān)原理的理解.

PBR 是什么

在 3D 中光照早期相關(guān)的實現(xiàn), 就是 Blinn-Phong , 半蘭伯特 這些了, 也是光線與視線的點積去影響 BaseColor , 最終呈現(xiàn)出光線直照更亮的效果. 這一段時期, 其實是用光線與視線之間的關(guān)系來模擬現(xiàn)實. 從這里可以看出來, 只需要光線與視線的點積, 計算量不大, 又可以比較好地達到現(xiàn)實效果, 所以最受大家的歡迎.

而 PBR 呢, 其實從它的名字(基于物理的渲染)就可以看出來, 它的整體邏輯, 是以現(xiàn)實的物理為基礎(chǔ), 來實現(xiàn)渲染. 這里要說一點, 這個是基于物理, 而不是完全物理(現(xiàn)在有計算也不可能完全按照現(xiàn)實來實現(xiàn)), 所以 PBR 中所有的實現(xiàn)都是以物理為基礎(chǔ), 同時又適應(yīng)當前的硬件而做的渲染實現(xiàn).

PBR 同時也是一種美術(shù)與程序之間交流的紐帶. 大家都遵守同樣的渲染邏輯, 就可以保證設(shè)計效果與最終效果能達到良好的一致性.

PBR 理論

微平面理論

在現(xiàn)實中, 我們認為所有的平面(平整或粗糙), 以顯微鏡或微小尺寸去觀察, 它都不是完全平整的. 所以 PBR 引入了 Roughness (粗糙度) 這個變量.

能量守恒

現(xiàn)實中, 當一束光線照射到平面上, 會發(fā)現(xiàn) reflect(反射) 與 refract(折射) , 反射與拆射的能量總和肯定不會超過入射光線的能量.

// kS 反射系數(shù)
// kD 折射/漫反射系數(shù)
float kD = 1 - kS;

菲涅爾現(xiàn)象

Fresnel 現(xiàn)象也是在現(xiàn)實中很常見的一種現(xiàn)象. 任何物體的反射率都不是固定的, 當光線越接近掠過平面時, 光線的反射率會急劇提高. 舉個現(xiàn)實中的現(xiàn)象, 早上看路面, 會發(fā)現(xiàn)遠處是亮的.

PBR 實現(xiàn)

微平面實現(xiàn)

基于微平面理論, 當光線照在平面上, 反射光會因為平面粗糙度的原因, 會向各種方面反射, 當然其中根據(jù)法線與入射光線對稱的反射方向肯定是占大部分. 所以反射的光線不會是 100% , 那么這里我們就用一個法線分布函數(shù)來, 在反射的能量有多少.

同時微平面中, 還存在幾何遮蔽, 因為平面本身的粗糙度, 而導(dǎo)致光線進入平面上, 不會再反射拆射, 而是被消耗掉了. 或反射光線直接被平面上的凸起擋住.

法線分布函數(shù)的實現(xiàn)

float DistributionGGX(vec3 N, vec3 H, float roughness) {
    float a = roughness*roughness;
    float a2 = a*a;
    float NdotH = max(dot(N, H), 0.0);
    float NdotH2 = NdotH*NdotH;

    float nom   = a2;
    float denom = (NdotH2 * (a2 - 1.0) + 1.0);
    denom = PI * denom * denom;

    return nom / denom;
}

幾何遮蔽的實現(xiàn)

// ----------------------------------------------------------------------------
float GeometrySchlickGGX(float NdotV, float roughness) {
    float r = (roughness + 1.0);
    float k = (r*r) / 8.0;

    float nom   = NdotV;
    float denom = NdotV * (1.0 - k) + k;

    return nom / denom;
}

// ----------------------------------------------------------------------------
float GeometrySmith(vec3 N, vec3 V, vec3 L, float roughness) {
    float NdotV = max(dot(N, V), 0.0);
    float NdotL = max(dot(N, L), 0.0);
    float ggx2 = GeometrySchlickGGX(NdotV, roughness);
    float ggx1 = GeometrySchlickGGX(NdotL, roughness);

    return ggx1 * ggx2;
}

菲涅爾反射

菲涅爾的本質(zhì)其實就是入射光線與法線的不同夾角會導(dǎo)致不同的反射率.

vec3 fresnelSchlick(float cosTheta, vec3 F0) {
    return F0 + (1.0 - F0) * pow(clamp(1.0 - cosTheta, 0.0, 1.0), 5.0);
}

更詳細的理論可以參考這里

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末键闺,一起剝皮案震驚了整個濱河市践叠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌峻呕,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡缭受,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進店門该互,熙熙樓的掌柜王于貴愁眉苦臉地迎上來米者,“玉大人,你說我怎么就攤上這事宇智÷悖” “怎么了?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵随橘,是天一觀的道長败明。 經(jīng)常有香客問我,道長太防,這世上最難降的妖魔是什么妻顶? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮蜒车,結(jié)果婚禮上讳嘱,老公的妹妹穿的比我還像新娘。我一直安慰自己酿愧,他們只是感情好沥潭,可當我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著嬉挡,像睡著了一般钝鸽。 火紅的嫁衣襯著肌膚如雪汇恤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天拔恰,我揣著相機與錄音因谎,去河邊找鬼。 笑死颜懊,一個胖子當著我的面吹牛财岔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播河爹,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼匠璧,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了咸这?” 一聲冷哼從身側(cè)響起夷恍,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎媳维,沒想到半個月后裁厅,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡侨艾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了拓挥。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片唠梨。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖侥啤,靈堂內(nèi)的尸體忽然破棺而出当叭,到底是詐尸還是另有隱情,我是刑警寧澤盖灸,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布蚁鳖,位于F島的核電站,受9級特大地震影響赁炎,放射性物質(zhì)發(fā)生泄漏醉箕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一徙垫、第九天 我趴在偏房一處隱蔽的房頂上張望讥裤。 院中可真熱鬧,春花似錦姻报、人聲如沸己英。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽损肛。三九已至厢破,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間治拿,已是汗流浹背摩泪。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留忍啤,地道東北人加勤。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像同波,于是被迫代替她去往敵國和親鳄梅。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,955評論 2 355

推薦閱讀更多精彩內(nèi)容