紋理貼圖、法線貼圖钞脂、切線空間法線貼圖

前言:我好像弄懂了一點(diǎn)點(diǎn),把這個再梳理一遍

一切都要從 Shader 說起

Shader 分為「頂點(diǎn)渲染器」和「片段渲染器」

  • 「頂點(diǎn)渲染器」

「頂點(diǎn)渲染器」保存三角形的三個頂點(diǎn)的 u v 值捕儒,給后續(xù)片段渲染器提供數(shù)據(jù)冰啃。但是返回 Viewport × Projection × ModelView × uv 值邓夕。

  • 「片段渲染器」

在調(diào)用「片段渲染器」之前,遍歷屬于三角形的最大矩形阎毅,用重心法算出比例焚刚。傳遞給「片段渲染器」,「片段渲染器」拿到這個比例以后就可以算出屬于這個點(diǎn)的 u扇调、v 值矿咕。通過 u、v 值從 diffuse 貼圖中拿到顏色狼钮。

用圖解就是這樣

u = \alpha u_0 + \beta u_1 + \gamma u_2
v = \alpha v_0 + \beta v_1 + \gamma v_2

這就是不考慮光照的紋理貼圖

法線貼圖

當(dāng)然通過\alpha ,\beta, \gamma 用插值的方法可以計(jì)算任一點(diǎn)的法線碳柱。

但是我們可以存儲法線,像 diffuse 貼圖那樣通過 uv 訪問熬芜。

存儲法線的貼圖

我們?yōu)槭裁葱枰ň€貼圖莲镣?

通過法線,我們可以計(jì)算該點(diǎn)的光照強(qiáng)度涎拉。使紋理感更強(qiáng)瑞侮。

法線貼圖的制作

可以看我這篇文章如何產(chǎn)生法線貼圖
(我是翻譯國外大神的,但是國外大神有點(diǎn)爛尾鼓拧,有關(guān)鍵問題沒有解決)

只要知道

  • 是可以從普通 「texture」貼圖中計(jì)算法向量的半火。但是還有很多其他的辦法

    左圖為普通 texture,右圖為由左圖計(jì)算的法線貼圖

這樣的法線定義在切線空間中

還沒完

這樣的法線貼圖毁枯,有一個問題

舉個例子慈缔,有一個正方體,每一面都貼相同的圖种玛,而由相同的圖來說藐鹤,法向量永遠(yuǎn)一樣。但是由于在空間中位置的不一樣赂韵,每一面的世界坐標(biāo)系的法向量不可能一樣娱节。所以有的面算光強(qiáng)度的時候就會失敗祭示!

再舉個例子肄满,我們把世界坐標(biāo)系中物體的表面法向量不指向 z 軸附近,指向 y 軸附近质涛。其他的不變稠歉,從貼圖中得到的法向量還是指向 z 軸附近的。所以光照強(qiáng)度肯定還是錯的汇陆!

明白了就給我點(diǎn)個贊吧

所以我們需要計(jì)算出一種矩陣怒炸,把法線從切線空間變換到一個不同的空間,這樣在切線空間的法線就能和表面法線方向?qū)R了

一個神奇的矩陣

這個矩陣牛逼壞了

我們要計(jì)算的矩陣叫做「TBN 矩陣」毡代。T B N 分別代表 Tangent(切線)阅羹、Bitangent(副切線) Normal(法向量)

下面敘述推導(dǎo)過程

  • 首先 N 是表面法向量

用差值算(用比例算)

n = \alpha n_0 + \beta n_1 + \gamma n_2

  • 看上圖 T勺疼、B 的方向和紋理方向一致。

看上圖可以寫出捏鱼,

E_1 = \Delta U_1T + \Delta V_1B
E_2 = \Delta U_2T + \Delta V_2B

可以寫出

(E_{1x}, E_{1y}, E_{1z}) = \Delta U_1(T_x, T_y, T_z) + \Delta V_1(B_x, B_y, B_z)
(E_{2x}, E_{2y}, E_{2z}) = \Delta U_2(T_x, T_y, T_z) + \Delta V_2(B_x, B_y, B_z)

寫出

\begin{bmatrix} E_{1x} & E_{1y} & E_{1z} \\ E_{2x} & E_{2y} & E_{2z} \end{bmatrix} = \begin{bmatrix} \Delta U_1 & \Delta V_1 \\ \Delta U_2 & \Delta V_2 \end{bmatrix} \begin{bmatrix} T_x & T_y & T_z \\ B_x & B_y & B_z \end{bmatrix}

最后得到

\begin{bmatrix} \Delta U_1 & \Delta V_1 \\ \Delta U_2 & \Delta V_2 \end{bmatrix}^{-1} \begin{bmatrix} E_{1x} & E_{1y} & E_{1z} \\ E_{2x} & E_{2y} & E_{2z} \end{bmatrix} = \begin{bmatrix} T_x & T_y & T_z \\ B_x & B_y & B_z \end{bmatrix}

算出 [T, B] 后記得要正則化噢执庐,加上表面法向量 N

\begin{bmatrix}T_x & T_y & T_z \\ B_x & B_y & B_z \\ N_x & N_y & N_z \end{bmatrix}

還沒完

哈哈,我騙你的啦导梆。一切都結(jié)束了轨淌。最后你只要記得,在切線空間里得到的法向量乘以這個矩陣问潭,就得到世界坐標(biāo)系中的法向量啦

最后實(shí)現(xiàn)渲染器的代碼

點(diǎn)個喜歡唄
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末猿诸,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子狡忙,更是在濱河造成了極大的恐慌梳虽,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件灾茁,死亡現(xiàn)場離奇詭異窜觉,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)北专,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進(jìn)店門禀挫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人拓颓,你說我怎么就攤上這事语婴。” “怎么了驶睦?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵砰左,是天一觀的道長。 經(jīng)常有香客問我场航,道長缠导,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任溉痢,我火速辦了婚禮僻造,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘孩饼。我一直安慰自己髓削,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布镀娶。 她就那樣靜靜地躺著立膛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪汽畴。 梳的紋絲不亂的頭發(fā)上旧巾,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天,我揣著相機(jī)與錄音忍些,去河邊找鬼鲁猩。 笑死,一個胖子當(dāng)著我的面吹牛罢坝,可吹牛的內(nèi)容都是我干的廓握。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼嘁酿,長吁一口氣:“原來是場噩夢啊……” “哼隙券!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起闹司,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤娱仔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后游桩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體牲迫,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年借卧,在試婚紗的時候發(fā)現(xiàn)自己被綠了盹憎。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡铐刘,死狀恐怖陪每,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情镰吵,我是刑警寧澤檩禾,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站捡遍,受9級特大地震影響锌订,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜画株,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一辆飘、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧谓传,春花似錦蜈项、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至诗祸,卻和暖如春跑芳,著一層夾襖步出監(jiān)牢的瞬間轴总,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工博个, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留怀樟,地道東北人。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓盆佣,卻偏偏與公主長得像往堡,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子共耍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評論 2 345