延續昨天Day16留下來的坑,這就來講解法線貼圖技術會需要了解的切線空間~!
之前說到法線貼圖將法線存於貼圖中,並利用公式的轉換儲存在像素的顏色中。
現在我們讀取這張貼圖,然後把像素再度轉換為向量,這樣我們就可以直接使用法向量了!
...
不!還不行!
之前的範例中,我們所使用的法向量,是由頂點計算出來的向量,所以法向量座標的原點就是對應頂點所在坐標系的原點,也是模型自己的原點,但是法線貼圖所出來的法向量的原點是在頂點的位置,這就是為什麼說需要轉換的原因,模型的頂點和紋理貼圖的座標是在模型空間,而法線貼圖的座標是在「切線空間」
接下來要做的就是「空間與空間的轉換」,換個說法就是用線性轉換將法向量的原點換到模型的頂點上,或是由模型的原點換到法向量上,也是選擇把模型空間換到切線空間,或是由切線空間換到模型空間。
Day12介紹看板功能的時候,有利用影片說過甚麼是線性轉換,下面就再一次附上影片:
既然要轉換,就需要矩陣,找出三個需要的向量:
首先,我們已經有一條向量了,我們空間的原點是頂點,那Z軸就是頂點的法向量(Normal),接下來的X軸與Y軸皆為堆於該頂點的切線(Tangent),但頂點的切線有無限條,那是哪一條呢?好在大有附法線貼圖的模型,也會提供該頂點的切線這一條向量。
最後的第三條副切線(Bitangent)就簡單了,既然已經有了兩軸,我們只要在對其進行差積就可以得到結果。
最後我們獲得了矩陣TBN...
如上面所說,我們可以選擇要從模型空間轉到切線空間,還是從切線空間到模型空間,事實上法線貼圖也是可以在模型空間的,畢竟目標都是為了記錄法向量。上面的內容只是說「藍藍的」的貼圖是在切線空間,如果法線貼圖是存於模型空間會是長這樣:
fromSUDONULL
昨天(Day16)的範例是將選擇了在切線空間進行運算,目前「我知道」在切線空間處理主要會有重複利用跟減少儲存的好處,我了解的原因如下:
法線貼圖單純的紀錄法向量,如果換了一個這張貼圖運用到別的模型上,取出法向量還會是對的,因為模型空間的法向量貼圖是對應指定模型的。