[拟用于游戏中的延迟照明计算]
假设我有一个任意三角形,顶点ABC,法线DEF和纹理坐标LMN。
现在,我们有载体
G = B-A
H = C-A
O = M-L
P = N-L
下一步是计算切线空间:
G = O.s * T + O.t * U
H = P.s * T + P.t * U
这是我被困的地方......
G和H是3维向量,而O和P是2维。
从这一点开始,乘法到切线空间的工作原理如何? 一旦确定了切线空间,我如何获得正常和切线? T是正常的,U是正切的吗?
答案 0 :(得分:1)
我不使用纹理坐标来进行 TBN 矩阵计算
您的名字令人困惑,所以让我将三角形 3D 点重写为p0,p1,p2
。您需要 TBN 矩阵T,B,N
(正切,正常,正常)
<强>正常强>
法线垂直于三角形表面,因此您可以通过三角形顶点的叉积得到它:
N=(p1-p0)x(p2-p0)
方向取决于您的需求,因此您也可以使用此方法 N =(P2-P0)×(P1-P0) 这是唯一直接的向量
<强>切线,副法线强>
都位于三角形表面上,应与网格的其余部分兼容。这很棘手,取决于网格几何。如果已生成几何体(如球体,...),则可以将初始方向向量设置为某个轴。从那里很容易只使用交叉产品。例如,围绕Z轴的旋转几何: T =(0.0,0.0,1.0)×N B = N×T 这里的方向也取决于您的需求,因此您可以使用反向交叉操作数顺序
如果您不计算 TBN 兼容整个几何体,那么您将获得照明工件
有时整个网格使用扭曲的单个整个矩形纹理,例如在这个椭球头中:
仅在这种情况下,纹理坐标表示切线和副法线空间坐标,然后才能使用它们来获取T,B
。我不使用这种方法,所以我将使用你的方程式。
让t0,t1,t2
为三角形的 2D 纹理坐标(相对于点p0,p1,p2
):
(p1-p0) = (t1-t0).s * T + (t1-t0).t * B
(p2-p0) = (t2-t0).s * T + (t2-t0).t * B
这是线性方程组(6个未知数6个方程),因此求解并计算T,B
(正切,副正规)。看这里How to calculate Tangent and Binormal?。解决方案也在那里(使用相同的字母)