MMD聯(lián)動(dòng)Unity學(xué)習(xí)筆記 Vol.53 Unity Shader Graph 節(jié)點(diǎn)解析

前言 ???? ???? ???? ???? ????
????這期我們還是跟著官方的視頻學(xué)習(xí)Unity里關(guān)于Shader Graph的內(nèi)容,這期是這個(gè)系列的第
九期,矩陣(Matrix)相關(guān)所有節(jié)點(diǎn)。




????我們經(jīng)常聽到的矩陣,是一個(gè)數(shù)學(xué)概念,簡單來講就是一個(gè)由M乘N的標(biāo)量數(shù)組,在Unity中,矩陣通常被用于平移,縮放,旋轉(zhuǎn)等等。

????顧名思義,這幾個(gè)節(jié)點(diǎn)的作用,分別是自定義一個(gè)2乘2,3乘3,4乘4的矩陣。

????除此之外,在前面幾期我們了解了Input Geometry中的實(shí)體空間,模型空間,切線空間,視角空間之間的變換,也是由矩陣計(jì)算得到的結(jié)果。

????在Transformation Matrix中,Unity本身就給我們提供了很多變換的矩陣供我們進(jìn)行矩陣計(jì)算,不同于直接寫Shader時(shí)需要用代碼調(diào)用對(duì)應(yīng)的矩陣,Shader Graph在大多數(shù)情況下,只需要我們切換節(jié)點(diǎn)下方的模式即可。也從公式直接變回了簡單易懂的描述。

????除了Transformation中的內(nèi)置矩陣,Unity還有一 些關(guān)于轉(zhuǎn)換的內(nèi)置變量。

????當(dāng)然,在內(nèi)置的變換矩陣無法滿足我們的需求時(shí),就需要我們自定義一個(gè)轉(zhuǎn)換矩陣了,圖中的Tangent To World節(jié)點(diǎn)就是使用世界空間的Tangent By Tangent Normal來構(gòu)建的一個(gè)TBN變換矩陣,把Tangent空間的向量,轉(zhuǎn)換到世界空間中。

????在計(jì)算Tri-Planar節(jié)點(diǎn)時(shí),除了計(jì)算物體在模型空間和世界空間下的坐標(biāo),也需要對(duì)模型在模型空間和世界空間下的Normal和Tangent進(jìn)行矯正計(jì)算,保證每一個(gè)軸向上的貼圖,在旋轉(zhuǎn)后,還能保持正確的光照效果。否則,在旋轉(zhuǎn)各個(gè)方向的面時(shí),法線也會(huì)一起旋轉(zhuǎn),所以在這里。我們使用Matrix Construction Node來構(gòu)建對(duì)應(yīng)坐標(biāo)軸的旋轉(zhuǎn)矩陣。

????在構(gòu)建好XYZ軸向的旋轉(zhuǎn)矩陣后,再與三個(gè)方向的法線信息相乘,再旋轉(zhuǎn)面的時(shí)候,就能得到正確的法線了 。

????以Unity Built-in的變量為例,Unity Matrix Transpose MV是Unity MV的轉(zhuǎn)置矩陣,因?yàn)榍笠粋€(gè)矩陣的逆矩陣需要巨大的運(yùn)算量,但是求一個(gè)矩陣的轉(zhuǎn)置矩陣就很簡單。所以當(dāng)一個(gè)矩陣為正交矩陣的時(shí)候,通過轉(zhuǎn)置矩陣或者逆矩陣,是一個(gè)很有用的方法。

????而Unity Matrix,Inverse Transpose MV,專門用于將法線從模型空間變化到觀察空間,為Untiy Matrix的逆轉(zhuǎn)置矩陣,有同學(xué)可能會(huì)問,為什么不同Unity Matrix MV來處理法線,因?yàn)槿绻P陀胁唤y(tǒng)一縮放的時(shí)候,用Unity Matrix MV會(huì)造成方向失真。

????而Matrix Determinant節(jié)點(diǎn),行列式是數(shù)學(xué)中的一個(gè)函數(shù),將一個(gè)N乘N的矩陣a,映射到一個(gè)標(biāo)量中,一般用來求解矩陣,Shader中使用的情況比較少。感興趣的同學(xué)可以自行深入了解。