Unity Shader切線空間

2021-08-07 01:43:37 字數 1048 閱讀 3101

在使用凹凸紋理時我們經常會用到乙個叫切線空間的東西。而這個切線空間裡有三個引數,頂點法線(normal)、頂點次法線(binormal)和頂點切線(tangent)。這三個引數有什麼意思,是如何得來的呢?我們來詳細講下。

假設有乙個三角形平面abc,a點的切線空間就如圖:(t,n,b兩兩正交)

注:a點座標pos1,b點座標pos2,c點座標pos3。

a點uv座標uv1,b點uv座標uv2,c點uv座標uv3。

頂點法線(normal)

這個好理解,就是垂直在頂點所在三角形平面上的方向量。通過三角形相鄰兩條邊的叉積來求得。a點的法線公式:

p1 = pos2-pos1;

p2 = pos3-pos1;

n = (p1.y * p2.z - p1.z*p2.y , p1.z*p2.x-p1.x*p2.z , p1.x * p2.y - p1.y*p2.x)

頂點次法線(binormal)

也叫副法線,他是與該頂點相切的一條切向量。

頂點切線(tangent)

他是另一條與頂點相切的切向量。他與頂點法線、頂點次法線、頂點切線構成乙個切線空間。

頂點切線是這個空間的x軸,頂點次法線是這個空間的y軸,頂點法線是z軸。這三個軸就構成了某個點的切線空間。另外次法線和切線還可以這樣理解:

切空間下的x軸和y軸就是頂點所在uv座標系下的u軸和v軸

。這樣是不是更易理解了。

頂點a的次法線和頂點切線的公式如下:

p1 = pos2-pos1;

p2 = pos3-pos1;

s1 = uv2 - uv1;

s2 = uv3 - uv1;

float t = 1.0f / (s1.x * s2.y - s1.y*s2.x);

tangent = (p1 * s2.y - p2 * s1.y) * t;

binormal = (p2*s1.x - p1 * s2.x) * t;

b點和c點的切線和次法線也是這樣計算的。這三組法線就構成了乙個切線空間矩陣tbn。

這個tbn可是非常有用的,在凹凸紋理的各種實現方法中都用到他。

UnityShader 螢幕空間全息掃瞄效果

前段時間剛玩 使命召喚11 的時候發現裡面新增了一種很高科技的掃瞄手榴彈,可以產生一圈類似全息效果的掃瞄圈,並顯示出牆後的敵人,類似這樣 最近打算實現乙個用在第三人稱中類似的效果,如下 實現方案 1.根據 cameradepthtexture計算螢幕空間畫素點的世界座標 2.將掃瞄發起位置的世界座標...

3D中的切線空間簡介

1 什麼是tangent space?tangent space和world space,view space其實是同樣的概念,均是代表三維座標系。在這個座標系中,x軸對應紋理座標的u方向,沿著該軸紋理座標u線性增大。y軸對應紋理座標的v方向,沿著該軸紋理座標v線性增大。z軸則是uxv,垂直於紋理平...

3D中的切線空間簡介

1 什麼是tangent space?tangent space和world space,view space其實是同樣的概念,均是代表三維座標系。在這個座標系中,x軸對應紋理座標的u方向,沿著該軸紋理座標u線性增大。y軸對應紋理座標的v方向,沿著該軸紋理座標v線性增大。z軸則是uxv,垂直於紋理平...