然后将重心坐标 (a, b, c) 调整为: (a,b,c)=a/pos[0].w+b/pos[1].w+c/pos[2].w(a/pos[0].w,b/pos[1].w,c/pos[2].w)
这里的 w 就是 ViewSpace 的 z ,这个很长的分母就是所谓对 Z1 插值的结果,三个分子就是将 I 提出后剩余的部分。
1 2 3 4 5 6 7 8 9 10 11 12
// 在投影平面上求得透视不正确的重心坐标。 Eigen::Vector3f tmpBC = BarycentricCoor(x + 0.5f, y + 0.5f, v); // pos[3] 存储的是 ViewSpace 中的 1/z。 float a = tmpBC[0] * v[0].pos[3]; float b = tmpBC[1] * v[1].pos[3]; float c = tmpBC[2] * v[2].pos[3]; float div = 1.f / (a + b + c); a *= div; b *= div; c *= div; // 重心坐标插值。 float z = Interpolate(a, b, c, v[0].pos[2], v[1].pos[2], v[2].pos[2]);
切线空间与法线贴图
推导:CSDN、LearnOpenGL、ShaderX
记录一点自己的理解,矩阵乘法可以看做坐标系的转换,例如 M * a 便是将定义在 M 坐标系下的 a 向量转换至 定义了 M 坐标系的坐标系 下。
在这个问题中,M 便是当前片元所在的切线空间在世界坐标系下的表示(就是 TBN 矩阵),a 便是法线贴图中的向量。