Lesson 6——雙切線空間法線貼圖小總結(jié)

好,這篇博客是關(guān)于Lesson 6 bis tangent space normal mapping的總結(jié)

其實(shí)我們?cè)?strong>Lesson 6 Shader中已經(jīng)應(yīng)用了法線貼圖。但是那種方式的法線貼圖的受用面很少。它是所有的fragment應(yīng)用同一個(gè)法線向量,但是假如給定的法線貼圖向量和要渲染的表面上的法線向量指向不同榄檬,那么出來的光照就是錯(cuò)的逗概!

為了解決這個(gè)問題锹锰,我們這次學(xué)習(xí)雙切線空間中的法線貼圖拳亿,將所有的向量變換到切線空間中资盅,讓每一個(gè)fragment都有各自的法線向量调榄,這樣就不會(huì)出現(xiàn)法線貼圖和法線向量不一致時(shí),導(dǎo)致的光照錯(cuò)誤的問題呵扛。


先上圖看看我們要解決的問題——


兩個(gè)法線貼圖的對(duì)比

左邊的圖用的是統(tǒng)一的法線貼圖每庆,右邊的則是這次新的切線空間法線貼圖。

區(qū)別就是下嘴唇上是否有光择份,當(dāng)一個(gè)人張開嘴的時(shí)候扣孟,他的下嘴唇應(yīng)該被光照亮,但是左邊的明顯沒有荣赶。我們要解決的就是這個(gè)問題凤价。


好,我們先僅僅使用馮氏著色拔创,不用任何法線貼圖利诺,看看效果圖——

馮氏著色

再看看看應(yīng)用2個(gè)不同的法線貼圖的效果——


原始法線貼圖
切線空間法線貼圖

我想大家是可以發(fā)現(xiàn)第2張圖中人物細(xì)節(jié)更加完美了一些,那么這個(gè)是怎么實(shí)現(xiàn)的呢剩燥?


整個(gè)實(shí)現(xiàn)的原理慢逾,大家可以去看原博客,或者我翻譯的灭红。我這里總結(jié)侣滩,概括性地說一下。

片段

上圖中变擒,是一個(gè)片段君珠,也就是無數(shù)三角形中的一個(gè),我們知道該三角形每個(gè)頂點(diǎn)的紋理uv坐標(biāo)娇斑,法線向量策添。

通過重心坐標(biāo)我們可以列出公式——

重心坐標(biāo)

將上圖中的公式轉(zhuǎn)換成一個(gè)線性函數(shù)是下面這個(gè)——


線性函數(shù)

然后,我們平移一下上面這個(gè)三角形中的3個(gè)點(diǎn)——


平移

我們可以得到一個(gè)新的線性函數(shù)——


新的線性函數(shù)

上述中毫缆,未知量A B C唯竹。所以我們變換等式得到求A B C的解。

新的等式

換成矩陣形式——

矩陣形式的解

為了求解(A B C)我們求3維矩陣的逆矩陣——

解的公式

切線空間中的基準(zhǔn)是一個(gè)三元向量組苦丁,(i, j, n)浸颓,n就是原始的法線向量。我們只需要算i和j
最后猾愿,就是計(jì)算出切線空間的切線向量和副切線向量——

image.png

最后鹦聪,則進(jìn)行了坐標(biāo)系的變換,這個(gè)是在Lesson 5中有講到蒂秘。最后給大家看看核心代碼——

        Vec3f bn = (varying_nrm * bar).normalize();
        Vec2f uv = varying_uv * bar;

        mat<3, 3, float> A;
        A[0] = ndc_tri.col(1) - ndc_tri.col(0);  // (p1 - p0)對(duì)應(yīng)(p0p1)向量
                                                 // A[0][0]/A[0][1]/A[0][2]對(duì)應(yīng)x泽本、y、z三個(gè)分量
        A[1] = ndc_tri.col(2) - ndc_tri.col(0);  // Same as above
        A[2] = bn;                               // bn表示的是原始法線向量n

        mat<3, 3, float> AI = A.invert();        // AI是A的逆矩陣

        // (varying_uv[0][1] - varying_uv[0][0]) 表示(u1 - u0)
        // (varying_uv[0][2] - varying_uv[0][0]) 表示(u2 - u0)
        Vec3f i = AI * Vec3f(varying_uv[0][1] - varying_uv[0][0],
                             varying_uv[0][2] - varying_uv[0][0], 
                             0);

        // (varying_uv[1][1] - varying_uv[1][0]) 表示(v1 - v0)
        // (varying_uv[1][2] - varying_uv[1][0]) 表示(v2 - v0)
        Vec3f j = AI * Vec3f(varying_uv[1][1] - varying_uv[1][0],
                             varying_uv[1][2] - varying_uv[1][0], 
                             0);

        // Change of basis in 3D space
        // 向量(i j bn)是Darboux坐標(biāo)系的基準(zhǔn)
        mat<3, 3, float> B;
        B.set_col(0, i.normalize()); //rows[2][0] = (u1 - u0), rows[1][0] = (u2 - u0), rows[0][0] = (0)
        B.set_col(1, j.normalize()); //rows[2][1] = (v1 - v0), rows[1][1] = (v2 - v0), rows[0][1] = (0)
        B.set_col(2, bn);  // rows[2][2] = bn.x, rows[1][2] = bn.y, rows[0][2] = bn.z

        // 新的法線向量n(Darboux框架)
        // 把其他相關(guān)向量轉(zhuǎn)換到切線空間
        Vec3f n = (B * model->normal(uv)).normalize();

最后一行姻僧,則是得到了新的法線向量规丽。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市撇贺,隨后出現(xiàn)的幾起案子赌莺,更是在濱河造成了極大的恐慌,老刑警劉巖松嘶,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件艘狭,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡翠订,警方通過查閱死者的電腦和手機(jī)巢音,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來尽超,“玉大人官撼,你說我怎么就攤上這事∷扑” “怎么了傲绣?”我有些...
    開封第一講書人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)巩踏。 經(jīng)常有香客問我秃诵,道長(zhǎng),這世上最難降的妖魔是什么塞琼? 我笑而不...
    開封第一講書人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任顷链,我火速辦了婚禮,結(jié)果婚禮上屈梁,老公的妹妹穿的比我還像新娘。我一直安慰自己榛了,他們只是感情好在讶,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著霜大,像睡著了一般构哺。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,573評(píng)論 1 305
  • 那天曙强,我揣著相機(jī)與錄音残拐,去河邊找鬼。 笑死碟嘴,一個(gè)胖子當(dāng)著我的面吹牛溪食,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播娜扇,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼错沃,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了雀瓢?” 一聲冷哼從身側(cè)響起枢析,我...
    開封第一講書人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎刃麸,沒想到半個(gè)月后醒叁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡泊业,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年把沼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片脱吱。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡智政,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出箱蝠,到底是詐尸還是另有隱情续捂,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布宦搬,位于F島的核電站牙瓢,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏间校。R本人自食惡果不足惜矾克,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望憔足。 院中可真熱鬧胁附,春花似錦、人聲如沸滓彰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)揭绑。三九已至弓候,卻和暖如春郎哭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背菇存。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工夸研, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人依鸥。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓亥至,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親毕籽。 傳聞我的和親對(duì)象是個(gè)殘疾皇子抬闯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

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