【问题标题】:Calculate TBN matrix in vertex shader vs fragment shader?在顶点着色器与片段着色器中计算 TBN 矩阵?
【发布时间】:2019-07-31 08:30:51
【问题描述】:

我认为我们可以在顶点着色器和片段着色器中计算 TBN 矩阵。

// calculate in vs
varying mat3 vTbnMatrix;
void main() {
  vec3 n = normalMatrix * aNormal;
  vec3 t = normalMatrix * vec3(aTangent.xyz);
  vec3 b = cross(n, t) * aTangent.w;
  vTbnMatrix = mat3(t, b, n);
}

// calculate in fs
varying vec3 vNormal; // transformed by normalMatrix
varying vec3 vTangent; // transformed by normalMatrix
varying vec3 vBitantent;
void main() {
  mat3 tbnMatrix = mat3(vTangent, vBitangent, vNormal);
}

有什么区别?我认为我们可以在顶点着色器中计算 TBN 矩阵,因为它可以加速程序。

但是当我深入研究 THREE.js 和 PlayCanvas 引擎的源代码时,它们都在片段着色器中计算 TBN 矩阵。

在片段着色器中计算有什么好处?

【问题讨论】:

    标签: three.js webgl shader


    【解决方案1】:

    理论上,TBN 矩阵应该是正交的。

    在 three.js 中,法线、切线和双切线作为变量传递,在图元的面上进行插值,重新归一化,并在片段着色器中构造 TBN 矩阵。这样,矩阵列 (1) 具有单位长度,并且 (2) 可能接近正交。

    您可以在片段着色器中计算双切线,以强制它与内插法线和切线正交,但这样做可能不会产生太大差异,因为不能保证内插法线和切线无论如何都要正交。

    three.js r.102

    【讨论】:

    • 为了使TBN矩阵正交,我们可以使用Gram-Schmidt过程,对吧?而且我认为它可以在顶点着色器和片段着色器中处理......
    • 如我所说,TBN 矩阵的列必须有单位长度。这意味着需要在片段着色器中重新规范化列。
    猜你喜欢
    • 2015-08-04
    • 2011-05-24
    • 1970-01-01
    • 2019-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多