首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在顶点着色器和片段着色器中计算TBN矩阵?

在顶点着色器和片段着色器中计算TBN矩阵?
EN

Stack Overflow用户
提问于 2019-03-09 21:41:21
回答 1查看 510关注 0票数 3

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

代码语言:javascript
复制
// 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矩阵。

在片段着色器中进行计算有什么优势?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-11 11:24:25

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

在three.js中,法线、切线和双切线作为变化传递,跨基本体的面进行插值,重新规格化,并在片段着色器中构建TBN矩阵。这样,矩阵列(1)为单位长度,并且(2)假定接近正交。

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

three.js r.102

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55077930

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档